Backend/Java & Spring

JWT(Json Web Token)란?

khu2172 2025. 7. 5. 23:59

JWTJson Web Token의 약자로, 웹 또는 모바일 환경에서 사용자 인증(Authentication)을 위해 사용되는 토큰 기반 인증 방식이다.
로그인 후 서버가 발급한 토큰을 클라이언트가 저장하고, 이후 요청마다 해당 토큰을 함께 전송함으로써 사용자를 식별하고 권한을 확인한다.


JWT의 구조

JWT는 총 3개의 구성 요소로 이루어져 있으며, 각각 Base64Url 방식으로 인코딩되어

'.(dot)'으로 연결된다:

  1. Header
    • 토큰의 타입(JWT)과 해싱 알고리즘(예: HS256) 정보가 담긴다.
  2. Payload
    • 실제 토큰에 담고 싶은 사용자 정보가 포함된다.
    • 이 안의 정보를 Claim(클레임)이라 부른다.
  3. Signature
    • Header와 Payload를 조합한 후, 서버의 비밀 키(SECRET_KEY)를 사용해 서명한 값이다.
    • 토큰이 위변조되지 않았는지 검증하는 역할을 한다.

Claim(클레임)이란?

Claim은 Payload 안에 담기는 정보 조각이며, key-value 쌍으로 구성된다.
Claim의 종류는 다음과 같다:

  • 등록된(Registered) Claim
    • iss(발급자), exp(만료시간), sub(주제) 등 표준으로 정의된 클레임
  • 공개(Public) Claim
    • 충돌을 방지하기 위해 공개적으로 정의되거나 URI로 명시된 클레임
  • 비공개(Private) Claim
    • 발급자와 사용자 간 약속된 커스텀 정보 (예: userId, role 등)

Signature(서명)의 역할

Signature는 토큰의 위조를 방지하기 위한 검증 수단이다.
Header와 Payload가 조작되면 서명이 유효하지 않게 되며, 서버는 이를 통해 신뢰 여부를 판별한다.


JWT의 특징

  • Stateless
    서버가 사용자 정보를 별도로 저장하지 않아도 됨
  • Self-contained
    사용자 정보를 토큰 안에 자체적으로 포함하고 있음
  • URL-safe
    Base64Url 인코딩 덕분에 URL 파라미터나 HTTP 헤더에 안전하게 사용 가능
  • Authorization 헤더 사용
    보통 Authorization: Bearer <토큰> 형태로 전송됨

주의사항

  • Payload는 암호화되지 않으며, 누구나 열람할 수 있으므로 민감한 정보는 절대 포함하지 말아야 한다.
  • 반드시 만료 시간(exp)을 설정해 토큰 탈취와 재사용을 방지해야 한다.
  • 서명(Signature)이 유효하더라도, 정보 자체가 노출된다는 점을 인지해야 한다.

JWT는 인증 시스템을 간결하고 확장성 있게 만들어주는 강력한 도구이지만, 보안 설계에 대한 충분한 이해와 주의가 필요하다.
올바르게 사용한다면 세션 방식보다 더 효율적인 인증 체계를 구축할 수 있다.

'Backend > Java & Spring' 카테고리의 다른 글

CORS란? (Cross-Origin Resource Sharing)  (2) 2025.08.07
JWT와 OAuth의 차이점 정리  (0) 2025.07.29
DI와 객체지향 관점  (1) 2025.06.26
객체 지향  (0) 2025.06.22
AOP를 활용했던 경험  (0) 2025.06.13