2 λΆ„ μ†Œμš”

πŸ“˜ 쿠킀와 μ„Έμ…˜μ— λŒ€ν•΄μ„œβ€¦

쿠킀와 μ„Έμ…˜μ€ μ›Ήμ—μ„œ 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 도ꡬ듀이닀.
주둜, κ°œμΈν™”λœ 데이터λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•˜κ³ , β€˜κ°œμΈν™”λœ λ°μ΄ν„°β€™λž€, β€˜λΈŒλΌμš°μ €λ³„λ‘œ ꡬ별 κ°€λŠ₯ν•œ 데이터’ 이닀. μ˜ˆμ‹œλ‘œλŠ”, β€˜λ‘œκ·ΈμΈβ€™ 정도가 μžˆλ‹€.


1. μΏ ν‚€

μΏ ν‚€λŠ” λΈŒλΌμš°μ €μ— μ €μž₯λ˜λŠ” 데이터λ₯Ό λ§ν•œλ‹€.
μ›Ήμ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 것쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ μš”μ²­κ³Όμ‘λ‹΅μ΄λ‹€.
μΏ ν‚€μ—μ„œ μš”μ²­ 즉, HttpServletRequest에 ν•΄λ‹Ήν•˜λŠ” 것은 getCookie둜 μΏ ν‚€ 쑰회 κΈ°λŠ₯이닀.
응닡 즉, HttpServletResponse에 ν•΄λ‹Ήν•˜λŠ” 것은 setCookie둜 μΏ ν‚€ 등둝 κΈ°λŠ₯이닀.

1-1. μΏ ν‚€ μ €μž₯

λΈŒλΌμš°μ €μ—μ„œ μΏ ν‚€λ₯Ό μ €μž₯ν•  λ•ŒλŠ” Set-Cookieν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ ν‚€=κ°’ν˜•μ‹μœΌλ‘œ μ €μž₯ν•œλ‹€.

1-2. μΏ ν‚€ 호좜

λΈŒλΌμš°μ €κ°€ μ„œλ²„μ— β€˜μš”μ²­β€™μ„ 톡해 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.

1-3. μΏ ν‚€ μ‚¬μš© 예제

java μ½”λ“œλ‘œ μΏ ν‚€λ₯Ό μ‚¬μš©ν•΄λ³΄μž.

// μΏ ν‚€ 등둝
@RestController
public class CookieExamController {
	@GetMapping("/ex01")
	public void exam(HttpServletResponse rs) {
		Cookie cookie = new Cookie("key1", "value1");
        cookie.setMaxAge(60 * 60 * 24 * 7);	// μΏ ν‚€ 만료 μ‹œκ°„ μ„€μ •: 1주일 λ’€ μΏ ν‚€ 만료
		rs.addCookie(cookie);	// 응닡 헀더: Set-Cookie : key1=value1
	}
}

μœ„ μ½”λ“œλ₯Ό μž…λ ₯ν•˜κ³ , μ„œλ²„μ™€ ν•¨κ»˜ μ‹€ν–‰ν•΄λ³΄μž.
ν™”λ©΄μ—λŠ” 아무 것도 좜λ ₯λ˜μ§€ μ•Šμ§€λ§Œ f12λ₯Ό 눌러 κ°œλ°œμžλ„κ΅¬λ‘œ λ“€μ–΄κ°€μ„œ μƒˆλ‘œκ³ μΉ¨(f5)λ₯Ό 해보면, ex01μ΄λΌλŠ” μ΄λ¦„μ˜ μ£Όμ†Œκ°€ λ‚˜μ™€μžˆμ„κ±΄λ° κ·Έκ±Έ ν΄λ¦­ν•΄μ„œ 열어보면 μ•„λž˜μ™€ 같이 λ‚˜μ˜¨λ‹€.

> Response Header
Connection: keep-alive
Content-Length: 0
Date: Tue, 15 Nov 2022 10:31:37 GMT
Keep-Alive: timeout=20
Set-Cookie: key1=value1

μ—¬κΈ°μ„œ λ³Ό 수 μžˆλ“―μ΄, 응닡 ν—€λ”μ—μ„œ Set-Cookie: key1=value1ν˜•μ‹μœΌλ‘œ μΏ ν‚€λ₯Ό μ €μž₯ν•œ 것을 μ•Œ 수 μžˆλ‹€.

λ‹€μŒμœΌλ‘œ μΏ ν‚€λ₯Ό β€˜μ‘°νšŒβ€™ν•΄λ³΄μž.

// μΏ ν‚€ 쑰회
@GetMapping("/ex02")
public void exam2(HttpServletRequest rq) {
    Cookie[] cookies = rq.getCookies();
    
    for(Cookie cookie:cookies) {
        System.out.printf("name=%s, value=%s\n", cookie.getName(), cookie.getValue());
    }
}

μœ„ μ½”λ“œλ₯Ό 좔가해보면, μ½˜μ†” 창에 λ‚΄κ°€ λ“±λ‘ν•œ μΏ ν‚€μ˜ 정보λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€.
λ§ˆμ°¬κ°€μ§€λ‘œ f12λ₯Ό 눌러 μΏ ν‚€ 정보λ₯Ό 찾아보면

> Request Header
key1=value1; Idea-9b46b357=2a35f0b5-d223-466f-b572-fb3bf1131e42; _xsrf=2|8a3111ba|28a2b91ab6eab1bf2c74d869a4c98e20|1668274061; username-localhost-8888="2|1:0|10:1668479275|23:username-localhost-8888|44:ZjBjMzk2YjhkYjAwNDhkYTg4NmVjMTkxNzEzMzhiYmY=|704f56e52b3773386317885a767ea947455988928efa4e5641174da5af0de01a"

μœ„μ™€ 같이 μš”μ²­ 헀더에 쿠킀에 λŒ€ν•œ 정보λ₯Ό μ‘°νšŒν•  수 μžˆλ‹€.

μœ„μ˜ 방식이 λ„ˆλ¬΄ κΈΈμ–΄ 번거둜우면

@GetMapping("/ex03")
public void exam3(@CookieValue("key1") String name) {
    System.out.println(name);
}

μœ„μ™€ 같이 μž‘μ„±ν•  수 μžˆλ‹€.


2. μ„Έμ…˜

μ„Έμ…˜μ€ μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €λ₯Ό λ‹«μ•„ μ„œλ²„μ™€μ˜ 연결을 λλ‚΄λŠ” μ‹œμ κΉŒμ§€λ₯Ό μΌμ»«λŠ”λ‹€.
μΏ ν‚€κ°€ κ°œμΈν™”λœ 데이터λ₯Ό λΈŒλΌμš°μ €μ— μ €μž₯ν–ˆλ‹€λ©΄, μ„Έμ…˜μ€ μ„œλ²„μ— μ €μž₯ν•œλ‹€.
μΏ ν‚€λŠ” ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터에 λͺ¨λ“  데이터λ₯Ό μ €μž₯ν•œλ‹€λ©΄, μ„Έμ…˜μ€ μ„œλΉ„μŠ€κ°€ λ™μž‘ν•˜κ³  μžˆλŠ” μ„œλ²„μΈ‘μ— 데이터λ₯Ό μ €μž₯ν•˜κ³ , μ„Έμ…˜μ˜ 킀값을 ν΄λΌμ΄μ–ΈνŠΈμ— 남긴닀.
λΈŒλΌμš°μ €λŠ” ν•„μš”ν•  λ•Œλ§ˆλ‹€ 이 킀값을 μ΄μš©ν•΄ μ„œλ²„μ— μ €μž₯된 데이터λ₯Ό μ‚¬μš©ν•œλ‹€.
κ²°κ΅­ μ„Έμ…˜μ€ μΏ ν‚€μ˜ λ³΄μ•ˆμ„±μ„ λ³΄μ™„ν•΄μ£ΌλŠ” μƒν˜Έλ³΄μ™„μ μΈ 관계라고 λ³Ό 수 μžˆλ‹€.

2-1. μ„Έμ…˜ κ°’ 등둝

HttpSession 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.
μ—¬κΈ°μ„œ, setAttribute("key", "value")λ₯Ό 톡해 값을 등둝할 수 μžˆλ‹€.

2-2. μ„Έμ…˜ κ°’ 쑰회

getAttribute("key")λ₯Ό 톡해 λ“±λ‘λœ 값을 μ‘°νšŒν•  수 μžˆλ‹€.

2-3. μ„Έμ…˜ μ‚¬μš© 예제

// μ„Έμ…˜ 등둝
@RestController
public class SessionExamController {
	
	@GetMapping("/ex04")
	public void ex04(HttpSession session) {
		session.setAttribute("key2", "value2");
	}
}

μœ„μ˜ μ½”λ“œλ₯Ό μž…λ ₯ν•˜κ³  싀행해보고, ν•΄λ‹Ή νŽ˜μ΄μ§€μ—μ„œ f12λ₯Ό 눌러 ν™•μΈν•΄λ³΄μž.
μ„Έμ…˜μ΄ λ“±λ‘λ˜μ—ˆμ„ν…λ°, κ°œλ°œμžλ„κ΅¬μ—μ„œλŠ” 보이지 μ•ŠλŠ”λ‹€. 이전에 λ“±λ‘ν•œ μΏ ν‚€(key1=value1)만 λ‚˜μ˜¨λ‹€. μ™œλƒν•˜λ©΄, μ„Έμ…˜μ€ μ„œλ²„μ— μ €μž₯되기 λ•Œλ¬Έμ— λΈŒλΌμš°μ €μ—μ„œλŠ” 확인할 수 μ—†λ‹€. λŒ€μ‹  JESESSIONIDλΌλŠ” 값이 생겼을텐데, ν•΄λ‹Ή 값은 λΈŒλΌμš°μ €λ§ˆλ‹€ λ‹€λ₯΄λ‹€.
ctrl + shift + n을 λ™μ‹œμ— 눌러 크둬 μ‹œν¬λ¦Ώ λͺ¨λ“œλ‘œ λ“€μ–΄κ°€ 같은 url을 μž…λ ₯ν•œ ν›„, κ°œλ°œμžλ„κ΅¬λ‘œ 확인해보면 JSESSIONID의 값이 λ‹€λ₯΄κ²Œ λ‚˜μ˜€λŠ” 것을 λ³Ό 수 μžˆλ‹€.

λ‹€μŒμœΌλ‘œ 값을 μ‘°νšŒν•΄λ³΄μž.

@GetMapping("/ex05")
public void ex05(HttpSession session) {
    String value2 = (String)session.getAttribute("key2");
    System.out.printf("key2=%s\n", value2);
}

μœ„ μ½”λ“œλ₯Ό μž…λ ₯ν•˜κ³  μ‹€ν–‰ν•˜λ©΄, μ½˜μ†”μ°½μ— key2=value2라고 좜λ ₯λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

νƒœκ·Έ: ,

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°