[HttpSession] session์˜ ๋™์ž‘ ์›๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ

์„ธ์…˜ ๋ฐฉ์‹ ๋กœ๊ทธ์ธ

์„ธ์…˜์€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ SESSION ID์™€ ๋งคํ•‘ํ•˜์—ฌ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‹๋ณ„์ž์™€ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ SESSION ID๋ฅผ ์‘๋‹ตํ—ค๋”์— ๋„ฃ์–ด ์ „์†กํ•œ๋‹ค. ๋งค ์‘๋‹ต๋งˆ๋‹ค SESSION ID ๋งŒ ๋ณด๋‚ด๊ธฐ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์ปค์ง€์ง€ ์•Š๊ณ  ์„œ๋ฒ„์— ์ €์žฅ๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์›น๋ธŒ๋ผ์šฐ์ €์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŽ์€ ์ •๋ณด์˜๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์ €์žฅ๋Ÿ‰์ด ๋งŽ์•„์ง€๋ฏ€๋กœ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถ€๋‹ด์ด ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋กœ๊ทธ์ธ ๊ตฌํ˜„์€ ํ•„์ˆ˜๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰ํ–ˆ๋˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์ด ์—†์—ˆ๋˜ ํ”„๋กœ์ ํŠธ๋Š” ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

์ด๋ ‡๊ฒŒ ์•„๋ฌด๋ ‡์ง€ ์•Š๊ฒŒ ์‚ฌ์šฉํ–ˆ๋˜ ์„ธ์…˜์— ๋Œ€ํ•ด ์˜๋ฌธ์ ์ด ์ƒ๊ฒผ๋‹ค. 

 

session.getAttribute("user")

 

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ž A๊ฐ€ ์ ‘์†ํ•ด๋„ user๋ฅผ Key๊ฐ’์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ ,

์‚ฌ์šฉ์ž B๊ฐ€ ์ ‘์†ํ•ด๋„ user๋ฅผ Key๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

๊ฐ™์€ Key๊ฐ’์„ ์“ฐ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ด๋“ค์„ ๊ตฌ๋ณ„ํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฑธ๊นŒ??

 

 

์•„๋ž˜ ์ฝ”๋“œ๋Š” HttpSession์„ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ์ธ ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค. 

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๋‹ค์‹ถ์ด A๊ฐ€ ์š”์ฒญํ•œ HTTP ์š”์ฒญ์ธ์ง€ B๊ฐ€ ์š”์ฒญํ•œ HTTP ์š”์ฒญ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋”ฐ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ session tracking ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค. 

@Controller
public class LoginController {
			
        @PostMapping("/login")
	    public String login(MemberLoginDto memberLoginDto, HttpSession session , Model model){
	       
	        Member loginMember = loginService.login(memberLoginDto.getUserId(), memberLoginDto.getPassword());
	
	        if (loginMember == null) {
	            result.reject("loginFail", "์•„์ด๋”” ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
	            return "member/loginForm";
	        }
	
	        //๋กœ๊ทธ์ธ ์„ฑ๊ณต ์ฒ˜๋ฆฌ
	        //์„ธ์…˜์ด ์žˆ์œผ๋ฉด ์žˆ๋Š” ์„ธ์…˜ ๋ฐ˜ํ™˜, ์—†์œผ๋ฉด ์‹ ๊ทœ ์„ธ์…˜์„ ์ƒ์„ฑ
	        HttpSession session = request.getSession();
	        //์„ธ์…˜์— ๋กœ๊ทธ์ธ ํšŒ์› ์ •๋ณด ๋ณด๊ด€
	        session.setAttribute("loginMember", loginMember);
	
	        model.addAttribute("member",loginMember);
	        return "/member/memberInfo";
	    }
}

 

 

Session Tracking

์ผ๋ฐ˜์ ์ธ HTTP ์š”์ฒญ์—๋Š” ๋‚ด๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค. ๋ฐ›๊ณ  ์‹ถ์–ด ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ฃผ์†Œ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋„ ์žˆ์„ ๋ฟ์ด๋‹ค. ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ˆ˜์‹ ํ•œ ์š”์ฒญ์— ๋ˆ„๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด, ์ฆ‰ ์‹๋ณ„์ž๊ฐ€ ์žˆ์–ด์•ผ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” Session๊ฐ์ฒด๋ฅผ ์ฝ์–ด์„œ ์ฐธ์กฐํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ๋งํ•˜๋ฉด, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์–ด๋–ป๊ฒŒ ์‹๋ณ„ํ•˜๊ฒŒ ํ•˜๋Š๋ƒ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ Session Tracking Mechanism ์ด๋‹ค.

 

Session์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Cookie๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋‚ด๋ฆด ๋•Œ Session์„ ๋งŒ๋“ค๊ณ  ๊ทธ SessionID๋ฅผ Cookie๋กœ ๋‚ด๋ ค๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ๋‚ด๋ ค๊ฐ„ Cookie๋Š” ๊ทธ ๋’ค์— ์ด์–ด์˜ค๋Š” ์š”์ฒญ์— ๋ง๋ถ™์—ฌ์ ธ์„œ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ Cookie์— ์žˆ๋Š” Session ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ์š”์ฒญ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์›น๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ฟ ํ‚ค๋ชฉ๋ก์„ ๋ณด๋ฉด JSESSIONID ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์•„๋ž˜ ์‚ฌ์ง„์€ ์‹ค์ œ๋กœ ์ฟ ํ‚ค์— ์„ธ์…˜์ด ๋‹ด๊ธฐ๋Š” ๋ชจ์Šต์ด๋‹ค. 

 

 

 

๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด Response Header๋กœ JSESSIONID๋ฅผ ๊ฐ€์ง„ ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์œ„ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

์ฆ‰,  ์„ธ์…˜ํ‚ค๋ฅผ ๋‹ด์€ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์— ๋‹ด์•„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์„œ๋ฒ„์—์„  ์‚ฌ์šฉ์ž ๋งˆ๋‹ค์˜ ์„ธ์…˜์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.