JWT 토큰 구조와 각 구성 요소 🎟️

Lzhtk·2025년 8월 8일

오늘은 API 인증, 마이크로서비스 간 통신, SSO ( Single Sign-On ) 등 현대 웹 서비스에서 광범위하게 사용되는 JWT에 대해 알아보자 ❗❕


0 . JWT 구조를 왜 알아야 하지? 🤷‍♀️🤷‍♂️

  • 서두에서 말했듯이 JWT ( JSON Web Token )는 API 인증, 마이크로서비스 간 통신, SSO(Single Sign-On ) 등 현대 웹 서비스에서 굉장히 많이 사용되며 JWT의 구조와 역할을 모를 경우 여러 실수를 범할 수 있기 때문이다.

  • 위에서 말한 범할 수 있는 실수는 아래와 같다.

    • 1️⃣ 토큰에 민감 정보를 담아버리는 보안 실수
    • 2️⃣ 잘못된 만료 시간 설정으로 무기한 토큰 유효
    • 3️⃣ 변조 여부를 검증하지 못하는 취약점 발생
  • 이번 글에서는 이러한 이유로 JWT를 구성하는 크게 세 가지 요소들을 하나씩 뜯어보며, 어떤 역할을 하는지 이해해보겠다.


1 . 🌐 JWT

  • JWT는 JSON Web Token으로 JSON 객체를 안전하게 전송하기 위한 토큰 형식이다.
    • JSON 기반 -> 사람이 읽고 쓰기 쉬운 구조
    • Base64URL 인코딩 -> 안전한 문자열 변환
    • 서명( Signature ) -> 변조 방지
  • 사용 사례
    • 사용자의 인증 상태 유지 ( 로그인 후 API 요청 인증 )
    • 마이크로서비스 간 정보 전달
    • 모바일/웹 클라이언트 간 권한 위임

2 . 🧱 JWT 구조

  • JWT는 Header.Payload.Signature라는 세 부분으로 나뉜다.
  • 각 부분은 마침표로 구분되며, 모두 Base64URL로 인코딩된다.

예시 JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImV4cCI6MTczNTY4OTYwMH0
.fuX1xj1kJ-tLmJzG3c29f94UJckZBjhI7mFkYgH1UO0

3. 📚 구성 요소별 상세 설명

3.1 Header ( 헤더 )

  • 토큰 타입과 서명 알고리즘을 지정하는 역할을 한다.

    EX

    {
    	"alg": "HS256",
    	"typ": "JWT"
    }
  • alg -> 서명 알고리즘 ( ex : HS256, RS256 )

  • typ -> 토큰 타입 (JWT)

    ⚠ alg를 none으로 설정하면 서명 검증 없이 통과하는 취약점이 발생할 수 있다.


3.2 Payload ( 페이로드 )

  • 토큰에 담기는 실제 데이터( Claims )
    • Registered Claims ( 예약된 표준 필드 ) -> iss ( 발급자 ), sub ( 대상 ), exp ( 만료시간 ), iat ( 발급 시간 )등 표준화된 클레임
    • Public Claims -> 충돌 방지를 위해 누구나 정의 가능한 공개 정보
    • Private Claims -> 특정 시스템 간 합의된 정보
{
  "sub": "user123",
  "name": "John Doe",
  "admin": true,
  "exp": 1735689600
}

⚠ 중요 : Base64URL 인코딩은 암호화가 아니기에 누구나 디코딩이 가능하므로 비밀번호/카드번호 등 민감 정보는 절대 넣어서는 안된다 ❗❗
JWT는 기본적으로 서명(Signing)만 제공하며, 암호화(Encryption)는 JWE에서 다룬다.


3.3 Signature ( 서명 )

  • 토큰이 변조되지 않았음을 보장하는 역할을 한다.
  • 생성 방식
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret_key
)
  • 서명은 서버에서만 생성 가능 ( 비밀키 필요 )
  • 클라이언트는 서명 생성 불가 -> 무결성 검증 가능
  • 서명 방식에는 크게 2가지가 있다.
    • HMAC ( 대칭 키 방식 ) : 서명과 검증에 같은 시크릿 키를 사용한다. 구현이 간단하지만 키가 노출되면 위험함.
    • RSA ( 비대칭 키 방식 ) : 개인 키로 서명하고, 공개 키로 검증한다. 서명 발급자와 검증자가 분리될 수 있어, 외부 인증 서버와의 통합에 적합하다.

4 . 🌊 JWT 동작 흐름

1️⃣ 사용자가 로그인을 요청
2️⃣ 서버에서 인증 성공 시 JWT 발급
3️⃣ 클라이언트는 토큰을 localStorage, Cookie 등과 같은 곳에 저장
4️⃣ API 요청 시 Authorization 헤더에 첨부

Authorization: Bearer <JWT>

5️⃣ 서버는 서명 검증 후 응답

📌 한눈에 보기 좋게 정리

[User] -> 로그인 요청 -> [Server]  
[Server] -> JWT 발급 -> [User]  
[User] -> API 요청(JWT 포함) -> [Server]  
[Server] -> 서명 검증 후 응답  

5 . 💡 추가 보안 고려 사항

  • HTTPS 필수 ( 중간자 공격 방지 )
  • exp로 만료 시간 설정 -> 무기한 토큰 방지
  • 민감 정보는 Payload에 넣지 말 것 ❕
  • Refresh Token 전략 사용 -> Access Token 짧게 유지

마무리🔚

이렇게 오늘 JWT 토큰 구조와 각 구성 요소 그리고 동작흐름까지 알아보았다.
JWT는 간단하지만 강력한 인증/인가 도구이다.
오늘 알아본 구성 요소의 의미와 동작 원리를 이해하면 보안에 강하고 유지보수하기 좋은 인증 시스템을 만드는데 도움이 될 것이다 💯

0개의 댓글