JWT

JWT(JSON Web Token)는 웹 토큰 기반 인증의 한 형태로, 페이로드(payload) 정보를 JSON 형식으로 인코딩하여 생성되는 토큰이다. 주로 사용자 인증과 권한 부여를 위해 사용되며, 특히 웹 애플리케이션에서 세션 기반 인증을 대체하는 데 사용된다.

등장 배경

기존의 세션 기반 인증 방식에서는 서버가 세션을 관리하고, 클라이언트와의 각 요청마다 세션을 확인하는 등의 작업이 필요했다. 하지만 분산 아키텍처, 모바일 앱 등의 환경에서 이러한 방식은 복잡성을 높이고 확장성 문제를 유발하게 되었고, 이에 따라 클라이언트-사이드에서 토큰을 발급하고 관리하여 서버와의 인증 및 권한 부여를 처리하는 JWT가 등장하게 되었다.

구성 요소

  • 헤더(Header): 토큰의 타입과 해싱 알고리즘 정보를 담고 있는 JSON 객체
  • 페이로드(Payload): 토사용자의 식별 정보나 추가 데이터를 담고 있는 JSON 객체
  • 서명(Signature): 헤더와 클레임을 합친 후 비밀 키로 해싱하여 생성되는 서명. 이를 통해 토큰이 변조되지 않았음을 검증

장점

  • 서버의 세션 관리가 필요 없으므로 확장성이 용이
  • 클라이언트-사이드에서 토큰을 관리하므로 다양한 플랫폼 간에 적용하기 용이
  • 정보를 JSON 형식으로 포함하므로 확장성이 풍부
  • 토큰의 만료 시간을 포함할 수 있어 자동 로그아웃을 구현하기에 편리

단점 및 한계

  • 토큰이 클라이언트에 저장되어 보안 취약성 존재
  • 토큰 크기가 커질 수 있어 데이터 통신에 부담 가능성
  • 토큰 자체는 검증할 수 있지만, 서버에서 유효성을 검사하지 않는다면 토큰을 변조할 위험 존재
  • 민감한 정보가 토큰에 포함되지 않도록 주의가 필요

예시

Header:
{
  "alg": "HS256", // 해싱 알고리즘
  "typ": "JWT" // 토큰 타입
}

Payload:
{
  "sub": "user123", // Subject - 사용자 식별 정보
  "iat": 1628935680, // Issued At - 토큰 발급 시간
  "exp": 1628939280 // Expiration Time - 토큰 만료 시간
}

Signature:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(claims),
  secret
)

이 예시에서 헤더와 클레임은 Base64로 인코딩되어 서명과 결합되어 최종 JWT 토큰이 생성된다. 이 토큰은 클라이언트-사이드에서 저장되어 인증 및 권한 부여에 사용된다.