서버 쪽에 저장됨 + JSESSIONID
"세션은 어디 있는 거예요? 쿠키랑 같이 쓰이는데 뭐가 다른지..."
세션 정보는 서버 메모리 에 저장. 사용자에게는 「JSESSIONID」 라는 짧은 식별자만 쿠키로 발급. 다음 요청 시 그 ID 로 보관함을 찾아 정보 꺼냄.
@PostMapping("/login")
public String login(String userId, String password,
HttpSession session) { // ← 매개변수
Member m = service.login(userId, password);
if (m != null) {
session.setAttribute("loginUser", m); // 보관함에 저장
return "redirect:/";
}
return "redirect:/login?error";
}
@GetMapping("/mypage")
public String mypage(HttpSession session, Model model) {
Member u = (Member) session.getAttribute("loginUser"); // 꺼내기
if (u == null) return "redirect:/login";
model.addAttribute("user", u);
return "mypage";
}
| 메서드 | 역할 |
|---|---|
setAttribute(name, value) | 보관함에 데이터 저장 |
getAttribute(name) | 데이터 꺼냄 (없으면 null) |
removeAttribute(name) | 특정 데이터 삭제 |
invalidate() | 세션 폐기 (로그아웃) |
getId() | JSESSIONID 값 |
setMaxInactiveInterval(초) | 유효 시간 설정 |
기본 만료 시간: 30 분 (Tomcat 기본). 사용자가 30 분간 요청 안 보내면 세션 자동 삭제.
<!-- web.xml -->
<session-config>
<session-timeout>60</session-timeout> <!-- 60 분 -->
</session-config>
또는 코드에서:
session.setMaxInactiveInterval(60 * 60); // 60 분 (초 단위)
F12 → Application → Cookies 에서 JSESSIONID 항목 확인.
JSESSIONID (자바 표준)F4E2A91B...)👉 즉 「쿠키 vs 세션」 에서 세션도 쿠키를 쓴다. 차이는 「무엇이 보관함에 저장되느냐」.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty sessionScope.loginUser}">
<span>${sessionScope.loginUser.name}님</span>
</c:if>
👉 EL 의 sessionScope 로 직접 접근. ${sessionScope.loginUser} = session.getAttribute("loginUser").
@GetMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
대안: 외부 캐시(Redis), JWT 토큰 등. 본 과정은 단일 서버 가정.
세션은 서버에 있다는 정도만 안다.
JSESSIONID 가 「열쇠」 임을 안다. HttpSession 메서드를 코드로 사용 가능.