[LG U+ ์œ ๋ ˆ์นด3๊ธฐ]Spring MVC | HttpSession ๋กœ๊ทธ์ธ → ์œ ์ง€ → ๋กœ๊ทธ์•„์›ƒ ์‹ค์Šต ์ •๋ฆฌ

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

โบ ์„ธ์…˜ ๋™์ž‘ ์›๋ฆฌ

  1. ๋กœ๊ทธ์ธ ์‹œ HttpSession ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋จ.
  2. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ Set-Cookie: JSESSIONID=๊ฐ’์„ ์‘๋‹ต ํ—ค๋”๋กœ ๋ณด๋ƒ„.
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ดํ›„ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค Cookie: JSESSIONID=๊ฐ’์„ ์ž๋™ ์ „์†กํ•จ.
  4. ์„œ๋ฒ„๋Š” ํ•ด๋‹น JSESSIONID๋กœ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉ.
  5. session.invalidate()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น ์„ธ์…˜์€ ์ฆ‰์‹œ ์‚ญ์ œ๋จ.
  6. ์ดํ›„ ์ƒˆ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์„ธ์…˜์ด ์ƒ์„ฑ๋˜์–ด ์ƒˆ๋กœ์šด 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 ์ธ์ฆ ํ† ํฐ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•  ๋•Œ ๊ธฐ์ดˆ๊ฐ€ ๋œ๋‹ค.