[Spring] Session (2)

이연우·2025년 7월 28일

TIL

목록 보기
58/100

🗂️ Spring의 Session

  • Spring에서는 Session을 쉽게 다루도록
    @SessionAttribute라는 어노테이션이 제공됨

📚 @SessionAttribute란?

  • Session에 저장된 값을 간편하게 조회할 때 사용하는 어노테이션
항목설명
🧷 생성 역할 ❌request.getSession(true)처럼 세션을 새로 만들지 않음
🔍 조회만 가능이미 세션이 존재하는 경우에만 사용해야 함
🔧 로그인 여부 판별required = false를 통해 로그인 여부 조건 분기 처리 가능

🧪 사용 예시

@SessionAttribute(name = Const.LOGIN_USER, required = false) UserResponseDto loginUser

→ 로그인한 경우: 세션에서 사용자 정보를 받아옴
→ 로그인하지 않은 경우: loginUser == null

🖥️ 컨트롤러 예시 (SessionHomeController)

@GetMapping("/v2/session-home")
public String homeV2(
    @SessionAttribute(name = Const.LOGIN_USER, required = false) UserResponseDto loginUser,
    Model model
) {
    if (loginUser == null) return "session-login"; // 로그인 X
    model.addAttribute("loginUser", loginUser);    // 로그인 O
    return "session-home";
}

📌 세션 유무만 판별하면 되므로 코드가 훨씬 간결해짐

💬 URL에 jsessionid가 보이는 이유는?

  • 일반적으로는 Cookie를 통해 Session이 유지됨
  • 하지만 Cookie를 지원하지 않는 브라우저나 설정에서는
    jsessionid를 URL로 전달함

🧵 작동 원리

  • 최초 로그인 시 Set-CookieJSESSIONID 저장
  • 이후 요청에서는 쿠키를 이용해 세션 연결
  • 만약 쿠키 사용이 불가한 경우
    URL?jsessionid=12345abc 형태로 세션 식별자를 포함시킴

⚙️ URL에 jsessionid 안 나오게 하려면?

  • application.properties
server.servlet.session.tracking-modes=cookie
  • application.yml
server:
  servlet:
    session:
      tracking-modes: cookie

오직 쿠키 방식으로만 세션을 추적함 (보안 ↑)


📚 Session 정보

  • HttpSession은 Session을 간편하게 사용할 수 있도록 다양한 기능을 지원함

🔍 코드 예시 (SessionController)

@GetMapping("/session")
public String session(HttpServletRequest request) {
    HttpSession session = request.getSession(false);
    if (session == null) return "세션이 없습니다.";

    log.info("session.getId()={}", session.getId());
    log.info("session.getMaxInactiveInterval()={}", session.getMaxInactiveInterval());
    log.info("session.getCreationTime()={}", session.getCreationTime());
    log.info("session.getLastAccessedTime()={}", session.getLastAccessedTime());
    log.info("session.isNew()={}", session.isNew());

    return "세션 조회 성공!";
}

🧾 HttpSession 정보 목록

메서드설명예시
getId()세션 ID (JSESSIONID) 확인a9c8x2e1-...
getMaxInactiveInterval()세션 유효 시간 (초 단위)1800초 = 30분
getCreationTime()세션이 처음 만들어진 시간2024-12-09 15:40:23
getLastAccessedTime()마지막으로 접근한 시간2024-12-09 15:40:23
isNew()이 세션이 새로 생성된 것인지 여부true / false

🧠 요약 정리

구분핵심 내용
🍥 @SessionAttribute세션에서 값을 간단하게 꺼내쓸 수 있는 Spring 기능
🔐 세션 유지 방식기본은 Cookie 방식 / jsessionid는 보조 수단
🧾 세션 정보 조회HttpSession을 통해 상세 정보 확인 가능
⚙️ 설정 관리tracking-modes=cookie 로 URL 노출 방지 가능
☑️ 실무 팁로그인 여부 확인에는 @SessionAttribute + required=false 조합이 깔끔함

0개의 댓글