Cookie)์ ์๋ต ํค๋(Set-Cookie)๋ฅผ ํตํด ์๋ฒ์ ์ฃผ๊ณ ๋ฐ์.Set-Cookie๋ฅผ ์ถ๊ฐํ์ฌ ์ฟ ํค ์ ๋ฌ.
Set-Cookie: sessionId=abc123; Max-Age=3600; Path=/; HttpOnly; Secure
Cookie: sessionId=abc123
@GetMapping("/set-cookie")
public ResponseEntity<String> setCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("username", "ํ๊ธธ๋");
cookie.setMaxAge(7 * 24 * 60 * 60); // 7์ผ ์ ์ง
cookie.setPath("/"); // ๋ชจ๋ ๊ฒฝ๋ก์์ ์ ํจ
cookie.setHttpOnly(true); // JavaScript ์ ๊ทผ ๋ถ๊ฐ
cookie.setSecure(true); // HTTPS์์๋ง ์ ์ก
response.addCookie(cookie);
return ResponseEntity.ok("Cookie set!");
}
@GetMapping("/get-cookie")
public ResponseEntity<String> getCookie(@CookieValue(value = "username", defaultValue = "Guest") String username) {
return ResponseEntity.ok("Hello, " + username);
}
@GetMapping("/get-all-cookies")
public ResponseEntity<String> getAllCookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " = " + cookie.getValue());
}
}
return ResponseEntity.ok("Cookies printed in server logs.");
}
์ฟ ํค๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ์ญ์ ํ๋ ค๋ฉด ์ฟ ํค์ ์๋ช ์ ์ค์ ํ๊ฑฐ๋, ์๋ฒ์์ ๋์ผํ ์ด๋ฆ๊ณผ ๊ฒฝ๋ก๋ก ๋ง๋ฃ๋ ์ฟ ํค๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
Max-Age๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์ฆ์ ์ฟ ํค๋ฅผ ์ญ์ ํฉ๋๋ค.Expires๋ฅผ ๊ณผ๊ฑฐ ์๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ์ญ์ ๋ฉ๋๋ค.HttpServletResponse๋ก ์ฟ ํค ์ญ์ @GetMapping("/delete-cookie")
public ResponseEntity<String> deleteCookie(HttpServletResponse response) {
Cookie cookie = new Cookie("username", null); // ๊ฐ์ null๋ก ์ค์
cookie.setMaxAge(0); // ์ฆ์ ๋ง๋ฃ
cookie.setPath("/"); // ๊ฒฝ๋ก ์ผ์น
response.addCookie(cookie);
return ResponseEntity.ok("Cookie deleted");
}
HttpServletRequest๋ก ์ฟ ํค ํ์ธ ํ ์ญ์ @GetMapping("/delete-specific-cookie")
public ResponseEntity<String> deleteSpecificCookie(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
Cookie deleteCookie = new Cookie("username", null);
deleteCookie.setMaxAge(0); // ์ฆ์ ๋ง๋ฃ
deleteCookie.setPath("/");
response.addCookie(deleteCookie);
}
}
}
return ResponseEntity.ok("Specific cookie deleted");
}
ํด๋ผ์ด์ธํธ ์ธก์์ JavaScript๋ฅผ ์ฌ์ฉํด ์ฟ ํค๋ฅผ ์ญ์ ํ ์๋ ์์ต๋๋ค. ๋จ, HttpOnly๊ฐ ์ค์ ๋ ์ฟ ํค๋ JavaScript๋ก ์ญ์ ํ ์ ์์ต๋๋ค.
// ์ฟ ํค ์ญ์
document.cookie = "username=; Max-Age=0; path=/;";
HttpOnly, Secure ์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ ์๋ฒ์์๋ง ์ญ์ ๊ฐ๋ฅํ๋ฉฐ, JavaScript๋ก ์ญ์ ํ ์ ์์ต๋๋ค.Max-Age=0 ๋๋ Expires๋ฅผ ๊ณผ๊ฑฐ๋ก ์ค์ .HttpOnly, Secure ์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ ์๋ฒ์์๋ง ์ญ์ ๊ฐ๋ฅ.Strict: ์ฟ ํค๋ ๋์ผํ ์ฌ์ดํธ์์๋ง ์ ์ก.Lax: ๋๋ถ๋ถ์ ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ์์ ์ฟ ํค๊ฐ ์ ์ก๋์ง ์์.None: ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ์์๋ ์ฟ ํค ์ ์ก(๋จ, Secure ํ์).Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(3600); // 1์๊ฐ
response.addCookie(cookie);
| ์ฅ์ | ๋จ์ |
|---|---|
| ํด๋ผ์ด์ธํธ ์ํ ์ ๋ณด๋ฅผ ์ฝ๊ฒ ์ ์ฅํ๊ณ ๊ด๋ฆฌ ๊ฐ๋ฅ | ์ฉ๋ ์ ํ(4KB) |
| ์๋ฒ ๋ถํ ๊ฐ์ (์ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง ์์) | ํด๋ผ์ด์ธํธ์์ ์กฐ์ ๊ฐ๋ฅ (๋ณด์ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ) |
| ์๋ช ์ค์ ๊ฐ๋ฅ (์งง๊ฑฐ๋ ๊ธด ์๊ฐ ๋์ ์ ์ง ๊ฐ๋ฅ) | HTTP๋ฅผ ํตํด ์ ์ก๋๋ฏ๋ก ๋์ฒญ ์ํ (HTTPS ํ์) |
| ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ ๋์ | ์ฟ ํค์ ์๋ชป๋ ์ค์ ์ผ๋ก ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ ์์ |
| ํญ๋ชฉ | ์ฟ ํค(Cookie) | ์ธ์ (Session) |
|---|---|---|
| ์ ์ฅ ์์น | ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) | ์๋ฒ |
| ๋ฐ์ดํฐ ์ฉ๋ | 4KB ์ ํ | ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์์กด |
| ๋ณด์ | ํด๋ผ์ด์ธํธ์์ ์ฝ๊ฒ ์กฐ์ ๊ฐ๋ฅ (HTTPS๋ก ์ ์ก ์ํธํ ํ์) | ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผ ๋ถ๊ฐ, ์๋ฒ๊ฐ ๊ด๋ฆฌ |
| ์๋ | ๋น ๋ฆ (ํด๋ผ์ด์ธํธ์ ์ ์ฅ) | ์๋์ ์ผ๋ก ๋๋ฆผ (๋งค ์์ฒญ๋ง๋ค ์๋ฒ ํ์ธ ํ์) |
| ์ ์ง ์๊ฐ | ๋ง๋ฃ ์๊ฐ ์ค์ ๊ฐ๋ฅ, ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ์ญ์ ๊ฐ๋ฅ | ์ธ์ ํ์์์ ์ค์ ๊ฐ๋ฅ |
| ์ฌ์ฉ ์ฌ๋ก | ์ฌ์ฉ์์ ๊ธฐ๋ณธ ์ค์ ์ ์ฅ, ๋ก๊ทธ์ธ ์ํ ์ ์ง | ์ฌ์ฉ์ ์ธ์ฆ, ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ |
