# JWT의 특징과 주의 사항

# JWT란?

  • 토큰 자체에 정보가 포함되어 있는 클레임 기반 토큰
  • 주로 인증과 인가를 구현하기 위해 사용

# JWT의 구성

  • 헤더, 페이로드, 시그니처로 구성
종류 설명
헤더 토큰의 암호화 알고리즘, 타입
페이로드 데이터(만료일, 사용자 정보)
시그니처 헤더와 페이로드가 변조되지 않았는지 확인하기 위한 용도
헤더와 페이로드는 비밀 키를 사용하여 헤더에 명시된 암호화 알고리즘으로 암호화하여 시그니처가 만들어짐

# JWT의 장점

  • JWT를 사용하여 인증과 인가를 구현하는 경우, 클레임 기반 토큰의 특성 덕분에 세션 기반 인증에 비해 사용자 정보를 조회하기 위한 추가적인 작업이 필요하지 않음
  • 서버가 상태를 관리하지 않기 때문에 서버가 이중화된 환경에서도 사용자의 정보를 일관성 있게 관리 가능 (세션 불일치 문제가 발생하지 않음)

# JWT 사용 시 주의 사항

  • JWT는 디코딩이 쉬우므로 민감한 정보를 담지 않아야 함 (Base64로 디코딩 가능)
  • 시크릿 키의 복잡도가 낮은 경우 Brute force Attack에 노출될 수 있음
  • JWT 탈취에 유의해야 하고, JWT 저장 공간, 리프레시 토큰 도입 여부, Refresh Token Rotation, 탈취 감지 및 대응에 대해 고민해야 함
  • 토큰의 잦은 갱신이 사용자 경험을 저해할 수 있음
    • 예를 들어 3시간 고민하고 쓴 글이 토큰이 만료되어 사라질 수 있음 → 슬라이딩 세션과 같은 전략으로 해결 가능
  • JWT none 알고리즘 공격을 유의해야 함
    • JWT 토큰의 헤더에 명시된 알고리즘을 none으로 변경하여 페이로드가 변조되어도 시그니처 검증 우회 가능
    • none 알고리즘 공격을 예방한 라이브러리 사용 혹은 none과 같은 약한 알고리즘에 대해 필터링 하는 등 주의가 필요함