개발

JWT 토큰 디코딩 방법

피터JK 2025. 1. 30. 21:54
728x90

 

1. 온라인 도구 이용

가장 쉬운 방법은 온라인 JWT 디코더를 사용하는 것입니다.

🔗 JWT 디코딩 사이트(https://jwt.io/)

  • Encoded 부분에 JWT 토큰을 입력하면 Decoded 부분에서 Header와 Payload의 내용을 확인할 수 있습니다.
  • 서명이 있는 경우 비밀 키를 입력하여 검증할 수도 있습니다.

2. Java 코드로 JWT 디코딩

Java에서 JWT를 디코딩하는 방법을 설명하겠습니다.

(1) io.jsonwebtoken(JJwt) 라이브러리 사용

Maven 설정

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

Java 코드

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

public class JwtDecoder {
    private static final String SECRET_KEY = "your_secret_key";

    public static void main(String[] args) {
        String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwMDM2MDB9.SIGNATURE";

        Claims claims = decodeToken(jwt);
        System.out.println("User ID: " + claims.getSubject());
        System.out.println("Role: " + claims.get("role"));
        System.out.println("Email: " + claims.get("email"));
    }

    public static Claims decodeToken(String jwt) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

(2) Java에서 서명 없이 디코딩하기

JWT는 Base64로 인코딩되어 있으므로, 서명을 검증하지 않고 Payload를 단순히 디코딩할 수도 있습니다.

import java.util.Base64;

public class JwtBase64Decoder {
    public static void main(String[] args) {
        String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwMDM2MDB9.SIGNATURE";

        String[] parts = jwt.split("\\.");
        String payload = new String(Base64.getDecoder().decode(parts[1]));

        System.out.println("Decoded Payload: " + payload);
    }
}

3. JavaScript에서 디코딩

프론트엔드(React, Vue, etc.)에서 JWT를 디코딩할 경우 jwt-decode 라이브러리를 사용하면 편리합니다.

npm install jwt-decode
import jwtDecode from "jwt-decode";

const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwMDM2MDB9.SIGNATURE";

const decoded = jwtDecode(token);

console.log("User ID:", decoded.sub);
console.log("Role:", decoded.role);
console.log("Email:", decoded.email);

4. Python에서 디코딩

Python에서는 jwt 라이브러리를 사용할 수 있습니다.

pip install pyjwt
import jwt

token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwicm9sZSI6ImFkbWluIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzAwMDAwMDAwLCJleHAiOjE3MDAwMDM2MDB9.SIGNATURE"

decoded = jwt.decode(token, options={"verify_signature": False})

print("User ID:", decoded["sub"])
print("Role:", decoded["role"])
print("Email:", decoded["email"])

정리

방법 서명 검증 사용 예

방법 서명 검증 사용 예
온라인 도구 (jwt.io) 간단한 디코딩
Java (JJwt) 서버에서 토큰 검증 및 디코딩
Java Base64 디코딩 단순 확인용
JavaScript (jwt-decode) 프론트엔드에서 토큰 정보 확인
Python (PyJWT) 서버에서 토큰 검증 및 디코딩

보안 주의사항

  • 인증이 필요한 경우 반드시 서명을 검증해야 합니다.
  • Base64 디코딩만 하면 누구나 내용을 볼 수 있으므로 중요한 데이터(비밀번호 등)는 포함하면 안 됩니다.
  • 토큰의 exp(만료 시간) 체크하여 만료된 토큰을 거부해야 합니다.

JWT를 디코딩하고 검증하는 방법을 상황에 맞게 선택하면 됩니다!

728x90