2025. 11. 5. 14:04ใJava/Spring
๐งฉ Spring MVC | HttpSession ๋ก๊ทธ์ธ → ์ ์ง → ๋ก๊ทธ์์ ์ค์ต ์ ๋ฆฌ
โถ ์ค์ต ๋ชฉํ
์ด๋ฒ ์ค์ต์ ๋ชฉ์ ์ Spring MVC์์ ์ธ์
(Session)์ ์์ฑ๊ณผ ์๋ฉธ์ ๋์ผ๋ก ํ์ธํ๋ ๊ฒ์ด๋ค.
๋ก๊ทธ์ธ → ์ธ์
์ ์ง(doSomething) → ๋ก๊ทธ์์(invalidate) ๊ณผ์ ์ ํตํด JSESSIONID ๊ฐ์ ๋ณํ๋ฅผ ํ์ธํ๋ค.
---
โท Controller ์ฝ๋
package com.mycom.myapp.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import jakarta.servlet.http.HttpSession;
@Controller
public class SessionController {
// ๋ก๊ทธ์ธ (GET์ผ๋ก ํ
์คํธ)
@GetMapping("/login")
public String login(String username, String password, HttpSession session) {
if ("Hey".equals(username) && "1234".equals(password)) {
session.setAttribute("username", username);
}
return "sessionTest1";
}
// ๋ก๊ทธ์ธ ์ ์ง ํ์ธ
@GetMapping("/doSomething")
public String doSomething() {
return "sessionTest2";
}
// ๋ก๊ทธ์์ ์ฒ๋ฆฌ
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "sessionTest3";
}
}
๊ฐ ๋ฉ์๋์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ๋ค:
| ๋ฉ์๋ | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|
login() |
/login | ๋ก๊ทธ์ธ ๊ฒ์ฆ ํ ์ธ์ ์์ฑ ๋ฐ username ์ ์ฅ |
doSomething() |
/doSomething | ๊ธฐ์กด ์ธ์ ์ ์ง ๋ฐ ์ํ ํ์ธ |
logout() |
/logout | ์ธ์ ๋ฌดํจํ (invalidate) |
---
โธ JSP ๊ตฌ์ฑ
โ ๊ณตํต include ํ์ผ
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String username = (String) session.getAttribute("username");
%>
<div>
<% if (username == null) { %>
<div>๋ก๊ทธ์ธ ํ์ธ์</div>
<% } else { %>
<div><%= username %>๋ ๋ฐ๊ฐ์ต๋๋ค</div>
<% } %>
</div>
์ด ์ฝ๋๋ ๋ชจ๋ JSP ์๋จ์ include๋์ด ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ํ๋ค.
๋ก๊ทธ์ธ ์ํ๋ฉด “OO๋ ๋ฐ๊ฐ์ต๋๋ค”๊ฐ, ์ธ์
์ด ์์ผ๋ฉด “๋ก๊ทธ์ธ ํ์ธ์”๊ฐ ์ถ๋ ฅ๋๋ค.
---
โ sessionTest1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.mycom.myapp.dto.CarDto"%>
<!DOCTYPE html>
<html>
<body>
<%@ include file="sessionInclude.jsp" %>
<h1>sessionTest1.jsp</h1>
</body>
</html>
โ sessionTest2.jsp / sessionTest3.jsp
์์ ๋์ผํ๋ฉฐ, ๋จ์ง <h1> ํ๊ทธ๋ง ๋ค๋ฅด๋ค:
sessionTest2.jsp→ ๋ก๊ทธ์ธ ์ ์ง ํ์ธsessionTest3.jsp→ ๋ก๊ทธ์์ ํ ์ธ์ ๋ง๋ฃ ํ์ธ
---
โน ์คํ ํ๋ฆ ๋ฐ ๊ฒฐ๊ณผ
โ ๋ก๊ทธ์ธ
http://localhost:8080/login?username=Hey&password=1234

โก doSomething (์ธ์ ์ ์ง)
http://localhost:8080/doSomething

โข ๋ก๊ทธ์์
http://localhost:8080/logout

โบ ์ธ์ ๋์ ์๋ฆฌ
- ๋ก๊ทธ์ธ ์ HttpSession ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋จ.
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ
Set-Cookie: JSESSIONID=๊ฐ์ ์๋ต ํค๋๋ก ๋ณด๋. - ๋ธ๋ผ์ฐ์ ๋ ์ดํ ๋ชจ๋ ์์ฒญ๋ง๋ค
Cookie: JSESSIONID=๊ฐ์ ์๋ ์ ์กํจ. - ์๋ฒ๋ ํด๋น JSESSIONID๋ก ์ฌ์ฉ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ฌ์ฉ.
session.invalidate()๊ฐ ํธ์ถ๋๋ฉด ํด๋น ์ธ์ ์ ์ฆ์ ์ญ์ ๋จ.- ์ดํ ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ก์ด ์ธ์ ์ด ์์ฑ๋์ด ์๋ก์ด JSESSIONID ๋ฐ๊ธ.
---
โป JSESSIONID ๋ณํ ํ์ธ ์์ฝ
| ์ํ | JSESSIONID | ์ค๋ช |
|---|---|---|
| ๋ก๊ทธ์ธ ์งํ | DA9F999DCC725D9F70D3D96EF42E96... | ์ ๊ท ์ธ์ ์์ฑ |
| doSomething | DA9F999DCC725D9F70D3D96EF42E96... | ๋์ผ ์ธ์ ์ ์ง |
| ๋ก๊ทธ์์ | 30B1968B2FBC741A82D9763D4B... | invalidate()๋ก ์ธ์ ์ด๊ธฐํ ํ ์ JSESSIONID ๋ฐ๊ธ |
---
โผ ํต์ฌ ๊ฐ๋ ์ ๋ฆฌ
HttpSession
์ฌ์ฉ์๋ณ ์ํ๋ฅผ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ์ํ ๊ฐ์ฒด.
๋ก๊ทธ์ธ ์ ๋ณด, ์ฅ๋ฐ๊ตฌ๋, ์ธ์ฆ ์ํ ๋ฑ์ด ์ฌ๊ธฐ์ ์ ์ฅ๋๋ค.
invalidate() ํธ์ถ ์ ์ธ์
์ด ์์ ํ ์ ๊ฑฐ๋๋ฉฐ, ์๋ก์ด ์์ฒญ์ ์๋ก์ด ์ธ์
์ ๋ง๋ ๋ค.
session.invalidate()
ํ์ฌ ํด๋ผ์ด์ธํธ์ ์ธ์
์ ๋ฌดํจํ(์ญ์ )ํ๋ ๋ฉ์๋.
์ฆ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์์ ํด๋น ์ธ์
๊ฐ์ฒด๊ฐ ์ ๊ฑฐ๋๊ณ , ํด๋ผ์ด์ธํธ๋ ์ดํ ์๋ก์ด JSESSIONID๋ฅผ ๋ถ์ฌ๋ฐ๋๋ค.
JSESSIONID
Spring MVC์ ๊ธฐ๋ณธ ์ธ์
์๋ณ์.
์ฟ ํค์ ์ ์ฅ๋์ด ์๋ฒ-ํด๋ผ์ด์ธํธ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ธ์
์ด ๋ฌดํจํ๋๊ฑฐ๋ ์๋ก ์์ฑ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
---
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ์ค์ต์ ๋จ์ํ “๋ก๊ทธ์ธ ํ์ด์ง”๊ฐ ์๋๋ผ, Spring์ด ์ด๋ป๊ฒ ์ธ์
์ ์์ฑํ๊ณ , ์ ์งํ๊ณ , ์ญ์ ํ๋์ง๋ฅผ ์ง์ ๋์ผ๋ก ํ์ธํ ์ค์ํ ๊ณผ์ ์ด์๋ค.
ํนํ Chrome์ Application → Cookies → JSESSIONID ํญ๋ชฉ์ ํตํด ์ธ์
์ ์์ฑ·์ ์ง·์ญ์ ์ฃผ๊ธฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธํ๋ค๋ ์ ์ด ํต์ฌ์ด๋ค.
์ด ์๋ฆฌ๋ ์ดํ Spring Security์ ๋ก๊ทธ์ธ ์ ์ง๋ JWT ์ธ์ฆ ํ ํฐ ๊ตฌ์กฐ๋ฅผ ์ดํดํ ๋ ๊ธฐ์ด๊ฐ ๋๋ค.