Session, Token, JWT 정리

패스트캠퍼스 Spring Security 강의 정리

Session

  • 장점
    • JSESSIONID는 유의미한 값이 아님
    • 서버에서 사용자 정보를 찾는 key로만 사용
    • 탈취되어도 개인 정보가 탈취되지 않음
  • 단점
    • 서버에 세션 정보 저장할 공간 필요
    • 사용자가 많을수록 저장할 공간이 많이 필요함
    • 분산 서버에서 세션 공유 어려움
  • 세션 하이재킹
    • 로그인된 상태를 가로채는 공격
    • 세션이 연결된 상태를 가로채 시스템에 접근하여 자원이나 데이터를 사용

Token

  • 세션 단점을 해결하기 위해 사용 가능
  • 사용자가 로그인한 후, 서버에서 토큰 생성하고 저장하지 않음(stateless)
  • 사용자가 요청할 때 토큰을 보내고 서버에서 사용자 인증
  • 토큰에는 사용자를 설명할 수 있는 데이터 포함
  • 장점
    • 별도 저장소가 필요하지 않음
    • 확장성이 좋음(분산 환경 또는 클러스터 환경)
  • 단점
    • 한 번 제공된 토큰은 회수하기 어려움(토큰의 유효기간을 짧게 둠)
    • 사용자 정보를 담고 있으므로 안정성 문제(민감한 정보를 포함시키면 안됨)

JWT

  • header
    • JWT를 검증할 때 필요한 정보
    • 암호화 알고리즘, key ID
    • JSON에 담긴 데이터를 UTF-8로 인코딩 후, Base64 URL-Safe로 인코딩
  • payload
    • 인증에 필요한 데이터
    • 데이터의 각 필드를 claim이라 함
    • 대부분의 경우 claim에 username 포함
    • 토큰 발행시간(iat), 토큰 만료시간(exp) 포함
    • JSON에 담긴 데이터를 UTF-8로 인코딩 후, Base64 URL-Safe로 인코딩
  • signature
    • 토큰 자체의 진위 여부를 판단하는 용도
    • header, payload를 합친 후, 비밀키로 hash 생성하여 암호화
  • Key rolling
    • 비밀키가 노출되면 모든 데이터가 유출될 수 있음
    • 비밀키를 여러 개 두어서 방지
    • 비밀키 하나에 unique ID(key ID)를 연결시킴
    • JWT 토큰 만들 때 헤더에 kid 포함
    • 서버에서 토큰 해석할 때 kid로 비밀키 찾아서 시그니처 검증