Session, Token, JWT 정리
03 Aug 2022패스트캠퍼스 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로 비밀키 찾아서 시그니처 검증