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 토큰이 생성된다. 이 토큰은 클라이언트-사이드에서 저장되어 인증 및 권한 부여에 사용된다.