์ค๋์ ์ฃผ์์ฌํญ (6/19, ์์์ผ)
- Spring ์๋ จ ์ฃผ์ฐจ ๋ฐ์
๊ฐ์ธ ๊ณผ์ ๊ฐ ํ ๋ฒ์ 2๊ฐ๋ ์ถ๊ฐ๋์๋ค................ ์๊ฐ์์ ์ฃฝ์ด๋ ค๋ ๊ณ ๋์ ์๋ฒ ๊ทธ๋ฐ๊ฑฐ ์๋๊ฐ
Cookie
& Session
/ | ์ฟ ํค(Cookie) | vs | ์ธ์ (Session) |
---|---|---|---|
์ค๋ช | ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ๋ชฉ์ ์ผ๋ก ์์ฑํ ์์ ์ ๋ณด๋ฅผ ๋ด์ ํ์ผ | - | ์๋ฒ์์ ์ผ์ ์๊ฐ ๋์ ํด๋ผ์ด์ธํธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ |
์ ์ฅ ์์น | ํด๋ผ์ด์ธํธ (์น ๋ธ๋ผ์ฐ์ ) | - | ์น ์๋ฒ |
์ฌ์ฉ ์) | ์ฌ์ดํธ ํ์ ์ "์ค๋ ๋ค์๋ณด์ง ์๊ธฐ" ์ ๋ณด ์ ์ฅ | - | ๋ก๊ทธ์ธ ์ ๋ณด ์ ์ฅ |
๋ง๋ฃ ์์ | ์ฟ ํค ์ ์ฅ ์์ ๋ง๋ฃ ์ผ์ ์ค์ ๊ฐ๋ฅ (๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์์๋ ์ ์ง๊ฐ ๊ฐ๋ฅํ๋ค) | - | ๋ค์ ์กฐ๊ฑด ์ค ํ๋๊ฐ ๋ง์กฑ๋ ๊ฒฝ์ฐ ๋ง๋ฃ 1. ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ 2. ํด๋ผ์ด์ธํธ ๋ก๊ทธ์์ ์ 3. ์๋ฒ์ ์ค์ ํ ์ ์ง๊ธฐ๊ฐ๊น์ง ํด๋น ํด๋ผ์ด์ธํธ์ ์ฌ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ |
์ฉ๋ ์ ํ | ๋ธ๋ผ์ฐ์ ๋ง๋ค ์์ด (Chrome ๊ธฐ์ค) - ํ๋์ ๋๋ฉ์ธ ๋น 180๊ฐ - ํ๋์ ์ฟ ํค ๋น 4KB(=4,096byte) | - | ๊ฐ์ ์ ํ ์์ (๋จ, ์ธ์ ์ ์ฅ์ ํฌ๊ธฐ ์ด์ ์ ์ฅ ๋ถ๊ฐ๋ฅ) |
๋ณด์ | ์ทจ์ฝํจ (ํด๋ผ์ด์ธํธ์์ ์ฟ ํค ์ ๋ณด๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝ ๋ฐ ์ญ์ ๊ฐ ๊ฐ๋ฅํ์ฌ ๊ฐ๋ก์ฑ๊ธฐ ๋นํ ์ ์๋ค) | - | ๋น๊ต์ ์์ (์๋ฒ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ์์ ํ๋ค) |
createCookie
/ getCookie
@GetMapping("/create-cookie")
public String createCookie(HttpServletResponse res) {
// value๋ก ๊ณต๋ฐฑ์ด ํฌํจ๋ ๋ฌธ์๊ฐ ๋์ด๊ฐ์์ ํ์ธ
addCookie("Robbie Auth", res);
return "createCookie";
}
Cookie ์์ฑ์ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ static ๋ฉ์๋
๋ก ์ ์ธํ๋ค.
public static void addCookie(String cookieValue, HttpServletResponse res) {
try {
// Cookie Value ์๋ ๊ณต๋ฐฑ์ด ๋ถ๊ฐ๋ฅํด์ encoding ์งํ
cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
// Path ์ง์
cookie.setPath("/");
// ์ฟ ํค ๋ง๋ฃ ์๊ฐ ์ง์
cookie.setMaxAge(30 * 60);
// Response ๊ฐ์ฒด์ Cookie ์ถ๊ฐ
res.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
}
new Cookie()
๋ฉ์๋๋ฅผ ํตํด Cookie์ ์ ์ฅ๋ Name
๊ณผ Value
๋ฅผ ๋ฐ๊ณ , ๋ฐ์ ๊ฐ๋ค์ Cookie ๊ฐ์ฒด์ ์์ฑ์๋ก ๋ฐ์ด๋ฉ ๋์ด ํด๋น ๊ฐ์ด ์ ์ฅ๋ Cookie ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
HttpServletResponse
๊ฐ์ฒด(res
)์ ์์ฑํ Cookie ๊ฐ์ฒด๊ฐ ์ถ๊ฐ๋์ด ๋ธ๋ผ์ฐ์ ๋ก ๋ฐํ๋๊ณ , ๋ฐํ๋ Cookie๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค ์ ์ฅ์์ ์ ์ฅ๋๋ค.
@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
System.out.println("value = " + value);
return "getCookie : " + value;
}
@CookieValue("Cookie์ Name")
โ Cookie์ Name ์ ๋ณด๋ฅผ ์ ๋ฌํด์ฃผ๋ฉด ํด๋น ์ ๋ณด๋ฅผ ํ ๋๋ก Cookie์ Value๋ฅผ ๊ฐ์ ธ์จ๋ค.
JSON Web Token์ ์ฝ์๋ก, JSON ํฌ๋งท์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ์ฟ ํค ์ ์ฅ์๋ฅผ ์ฌ์ฉํด JWT๋ฅผ ์ ์ฅํ๋ค.
Client ๊ฐ username(id), password ๋ก ๋ก๊ทธ์ธ ์ฑ๊ณต ์
์๋ฒ์์ "๋ก๊ทธ์ธ ์ ๋ณด" โ JWT ๋ก ์ํธํ (Secret Key ์ฌ์ฉ)
์๋ฒ์์ ์ง์ ์ฟ ํค(Cookie)๋ฅผ ์์ฑํด JWT๋ฅผ ๋ด์ Client ์๋ต์ ์ ๋ฌ
๋ธ๋ผ์ฐ์ ์ฟ ํค ์ ์ฅ์์ ์๋์ผ๋ก JWT๊ฐ ์ ์ฅ
์๋ฒ์์ API ์์ฒญ ์๋ง๋ค ์ฟ ํค์ ํฌํจ๋ JWT๋ฅผ ์ฐพ์์ ์ฌ์ฉ
Server โ
Client ๊ฐ ์ ๋ฌํ JWT ์์กฐ ์ฌ๋ถ ๊ฒ์ฆ (Secret Key ์ฌ์ฉ)
JWT์ ์ ํจ๊ธฐ๊ฐ์ด ์ง๋์ง ์์๋์ง ๊ฒ์ฆ
๊ฒ์ฆ ์ฑ๊ณต ์, JWT์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ธ.
ex) GET /api/products
: JWT๋ฅผ ๋ณด๋ธ ์ฌ์ฉ์์ ๊ด์ฌ์ํ ๋ชฉ๋ก ์กฐํ