ETC/etc3

[Spring] 세션과 JWT

montmer27 2026. 1. 5. 20:39

세션 vs JWT 개념

 

세션 (Session)

  • 서버가 사용자의 로그인 상태를 기억하고 관리
  • Stateful: 서버가 사용자의 상태를 계속 저장·유지
  • 서버 메모리 또는 DB에 세션 정보 저장

JWT (JSON Web Token)

  • JSON 객체를 사용한 인증 처리
  • Stateless: 서버에서 로그인 상태를 기억하지 않음 *중요
  • 비유: 신분증을 들고 다니는 것처럼 모든 정보가 JWT 자체에 포함
  • 서버는 JWT에 담긴 정보로 사용자 식별

JWT의 구조

3부분 구성 (aaaa.bbbb.cccc)

헤더(Header) . 페이로드(Payload) . 서명(Signature)

헤더 & 페이로드

  • 둘 다 eyJ로 시작 (Base64Url 인코딩 '{' )
  • Base64Url 인코딩 사용 (암호화 아님!)
    • 누구나 디코딩 가능
      -> 비밀번호 등 민감정보 절대 포함 금지

서명 (Signature)

  • 무결성을 보장하는 가장 중요한 부분
  • 생성 과정:
    1. 헤더와 페이로드를 인코딩
    2. 서버만 알고 있는 비밀키 사용
    3. 헤더에 지정된 알고리즘(예: HMAC SHA256)으로 해시 생성
  • eyJ로 시작하지 않음 (해시값이므로)
  • 검증: 서버가 다시 서명을 생성하여 들어온 서명과 비교

Refresh Token 전략

문제 상황 : 보안과 편의성 간 trade-off 관계!

  • JWT 만료시간을 짧게 하면 → 보안↑, 사용자 편의성↓
  • JWT 만료시간을 길게 하면 → 보안↓, 사용자 편의성↑

해결책: Access Token + Refresh Token

구분 Access Token Refresh Token

구분 Access Token Refresh Token
만료시간 짧음 (예: 15분) 김 (예: 2주)
사용빈도 모든 API 요청마다 Access token 갱신 시만
저장위치 클라이언트 DB에 저장 (Stateful)
발급시점 로그인 시, 갱신 시 로그인 시

 

특징

  • 하이브리드 방식: Stateless(JWT) + Stateful(Refresh token DB 저장)
  • 대부분의 시간은 Access token 사용 → Stateless의 이점 유지
  • 만료 시에만 Refresh token 사용 → 보안과 편의성의 절충안

유의점

  • Refresh token은 최초 로그인 시 access token과 함께 발급되며, access token 갱신 시 사용됨 (새로 만들어지는 것이 아님)

면접 키포인트

  1. Stateful vs Stateless 차이를 명확히 설명
  2. JWT의 3부분 구조와 각 역할
  3. Base64Url ≠ 암호화 (민감정보 포함 금지!)
  4. 서명(Signature)을 통한 무결성 검증 메커니즘
  5. Access/Refresh Token 조합의 필요성과 장점