JWT (Json Web Token)

2025. 5. 22. 18:23·Daily Logs/TIL (Today I Learned)

JWT (Json Web Token)

JWT(Json Web Token)는 Stateless(상태가 없는) 인증 방식입니다.

일반적으로 서버에서 세션 정보를 관리하는 방식과 달리, JWT는 클라이언트(프론트엔드, 브라우저 또는 앱)에 인증 정보를 저장합니다. 즉, 서버가 별도의 로그인 정보를 저장하지 않고, 클라이언트가 가지고 있는 토큰을 통해 인증을 처리하는 방식입니다.

JWT의 특징

1. 클라이언트가 보유

JWT는 클라이언트가 저장하고 관리합니다. 서버가 아닌 클라이언트 측에서 토큰을 관리하기 때문에 서버의 부하를 줄일 수 있습니다.

2. 크기가 큼 (뚱뚱한 JWT)

JWT는 다양한 정보를 담고 있어 텍스트 양이 많습니다.

JWT의 구조

JWT는 다음 세 가지 부분으로 구성됩니다:

  1. 헤더(Header)
    • 토큰 유형과 서명 알고리즘 정보
  2. 페이로드(Payload)
    • 클레임(Claim) 정보
    • 사용자의 정보, 권한, 발급자, 유효기간 등이 포함됩니다.
  3. 서명(Signature)
    • 토큰의 무결성을 검증하기 위한 서명

👉 jwt.io에서 직접 JWT를 확인하고 실습해 볼 수 있습니다.

주의사항

  • JWT에 포함된 데이터는 암호화된 것이 아니라 Base64URL 인코딩된 것입니다. 따라서 민감한 정보를 포함해서는 안 됩니다.
  • 누구든지 JWT의 페이로드를 쉽게 디코딩하여 읽을 수 있습니다.

예시 (Base64URL로 인코딩된 JWT)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Base64 vs Base64URL

  • 일반적인 Base64 인코딩은 특수 문자 +, /, =를 사용합니다.
  • URL에서 사용될 경우 특수문자 때문에 문제가 발생할 수 있어 JWT는 URL에서 안전한 Base64URL을 사용합니다.

Base64URL의 특징

  • + → -
  • / → _
  • = → 제거

왜 =는 제거할까요?

  • Base64는 항상 4의 배수 길이를 가지며, 그렇지 않은 경우 =를 넣어 길이를 맞춥니다. (=는 패딩 문자)
  • Base64URL은 길이를 맞추기 위해 사용하는 =를 제거하여 URL에서 사용하기 적합하게 만듭니다.

JWT의 역사 (재미로 읽기)

  • 2010년, IETF(인터넷 기술 표준화 기구)에서 서버가 클라이언트의 세션 정보를 저장하지 않고 인증할 수 있는 방법이 필요하여 JWT를 처음 제안했습니다.
  • Michael Jones, Bradley Meyer, Dmitri Zagidulin 등이 참여했습니다.
  • 2015년, RFC 7519에서 JWT가 공식적으로 표준화되었습니다.

👉 참고: RFC 7519


HTTP 요청에서 JWT 사용하기

JWT는 세션과 마찬가지로 HTTP 요청 간에 항상 포함시켜 보내야 합니다. 클라이언트는 매 요청 시 JWT를 헤더에 넣어서 보냅니다. HTTP는 Stateless 프로토콜이기 때문에 매번 인증 정보를 보내줘야 합니다.

예시:

Authorization: Bearer <JWT Token>

이 방식으로 서버는 매 요청마다 클라이언트가 누구인지 식별할 수 있습니다.

'Daily Logs > TIL (Today I Learned)' 카테고리의 다른 글

DB part.2  (0) 2025.06.08
DB part.1  (4) 2025.06.07
Package Manager (npm,yarn,pnpm)  (0) 2025.01.15
Nestjs DI(container) 의존성 주입에 대하여  (0) 2024.12.11
const로 선언된 변수는 재할당이 불가능하다.  (0) 2024.12.11
'Daily Logs/TIL (Today I Learned)' 카테고리의 다른 글
  • DB part.2
  • DB part.1
  • Package Manager (npm,yarn,pnpm)
  • Nestjs DI(container) 의존성 주입에 대하여
Jcob.moon
Jcob.moon
반가워요~ 하루하루 꾸준히 코딩 작성하는 곳입니다 !!
  • Jcob.moon
    Pixelated Thoughts
    Jcob.moon
  • 전체
    오늘
    어제
    • HelloWorld (174)
      • Daily Logs (123)
        • TIL (Today I Learned) (64)
        • Algorithm Practice (55)
        • Dev Book Notes (4)
      • Deep Dives (36)
        • 문제 해결 (Troubleshooting) (3)
        • CS Fundamentals (22)
        • Career Prep (4)
        • Technical Notes (7)
      • Project Log (7)
      • Any (3)
      • Cooperation (4)
        • Github (2)
        • Conventions (1)
        • Git (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
Jcob.moon
JWT (Json Web Token)
상단으로

티스토리툴바