# JWT의 특징과 주의 사항
# JWT란?
- 토큰 자체에 정보가 포함되어 있는 클레임 기반 토큰
- 주로 인증과 인가를 구현하기 위해 사용
# JWT의 구성
- 헤더, 페이로드, 시그니처로 구성
| 종류 | 설명 |
|---|---|
| 헤더 | 토큰의 암호화 알고리즘, 타입 |
| 페이로드 | 데이터(만료일, 사용자 정보) |
| 시그니처 | 헤더와 페이로드가 변조되지 않았는지 확인하기 위한 용도 헤더와 페이로드는 비밀 키를 사용하여 헤더에 명시된 암호화 알고리즘으로 암호화하여 시그니처가 만들어짐 |
# JWT의 장점
- JWT를 사용하여 인증과 인가를 구현하는 경우, 클레임 기반 토큰의 특성 덕분에 세션 기반 인증에 비해 사용자 정보를 조회하기 위한 추가적인 작업이 필요하지 않음
- 서버가 상태를 관리하지 않기 때문에 서버가 이중화된 환경에서도 사용자의 정보를 일관성 있게 관리 가능 (세션 불일치 문제가 발생하지 않음)
# JWT 사용 시 주의 사항
- JWT는 디코딩이 쉬우므로 민감한 정보를 담지 않아야 함 (Base64로 디코딩 가능)
- 시크릿 키의 복잡도가 낮은 경우 Brute force Attack에 노출될 수 있음
- JWT 탈취에 유의해야 하고, JWT 저장 공간, 리프레시 토큰 도입 여부, Refresh Token Rotation, 탈취 감지 및 대응에 대해 고민해야 함
- 토큰의 잦은 갱신이 사용자 경험을 저해할 수 있음
- 예를 들어 3시간 고민하고 쓴 글이 토큰이 만료되어 사라질 수 있음 → 슬라이딩 세션과 같은 전략으로 해결 가능
- JWT none 알고리즘 공격을 유의해야 함
- JWT 토큰의 헤더에 명시된 알고리즘을 none으로 변경하여 페이로드가 변조되어도 시그니처 검증 우회 가능
- none 알고리즘 공격을 예방한 라이브러리 사용 혹은 none과 같은 약한 알고리즘에 대해 필터링 하는 등 주의가 필요함