JWT 디코더

JWT 디코더

인증 오류를 살펴볼 때 JWT 헤더와 페이로드부터 확인하세요. Bearer 토큰을 붙여넣으면 JSON 내용과 exp·iat·nbf의 UTC 시각을 바로 읽을 수 있습니다.

JWT 디코더브라우저에서 디코딩
JWT 또는 Authorization: Bearer 값을 붙여넣으세요. 디코딩 API로 토큰을 전송하거나 입력을 저장하지 않습니다.
예제 불러오기
디코딩만 수행 · 서명 미검증

내용을 읽을 수 있어도 신뢰할 수 있는 것은 아닙니다. 토큰을 사용하기 전에 서명과 애플리케이션에 필요한 클레임을 검증하세요.

01 헤더

알고리즘과 토큰 정보

{
  "alg": "HS256",
  "typ": "JWT"
}

02 페이로드

토큰에 담긴 클레임

{
  "sub": "demo-user",
  "iss": "https://example.com",
  "aud": "demo-api",
  "iat": 1704067200,
  "nbf": 1704067200,
  "exp": 1704070800
}

시간 클레임 UTC

기기 시각과 비교하며 시계 오차 허용값은 적용하지 않습니다. 이 비교만으로 토큰의 유효성을 판단할 수 없습니다.

클레임UTC 시각현재 시각과 비교
iat발급 시각2024-01-01T00:00:00.000Z기기 시각 확인 중…
nbf사용 시작 시각2024-01-01T00:00:00.000Z기기 시각 확인 중…
exp만료 시각2024-01-01T01:00:00.000Z기기 시각 확인 중…

03 서명

헤더에 명시된 알고리즘: HS256 · 11 바이트 · 미검증

cGxhY2Vob2xkZXI

만료 전인데도 API가 토큰을 거부한다면

만료 시각만으로 인증 성공 여부를 판단할 수는 없습니다. iss는 발급자, sub는 토큰이 나타내는 주체, aud는 의도한 수신 대상입니다. 다른 API용 토큰을 보내고 있지 않은지 확인하세요. aud는 문자열이나 문자열 배열일 수 있습니다.

이 값은 모두 토큰에 적힌 주장입니다. 디코더는 내용을 보여 줄 뿐 발급자가 진짜인지 증명하지 않습니다. 필수 클레임과 권한 규칙은 애플리케이션에서 정해야 합니다.

JWT의 세 부분 읽기

일반적인 서명 JWT는header.payload.signature로 구성됩니다. 헤더와 페이로드는 UTF-8 JSON을 Base64url로 인코딩한 값입니다. 마지막 부분은 서명 또는 MAC 바이트이므로 JSON으로 읽는 대상이 아닙니다.

토큰만 넣거나Bearer, Authorization: Bearer 접두사를 붙여도 됩니다. HTTP 요청 전체를 붙여넣지는 마세요. 결과 JSON은 각각 복사할 수 있고, 큰 정수와 지수 표기를 포함한 원래 숫자 표현이 유지됩니다.

exp와 JavaScript 타임스탬프의 단위 차이

exp는 만료 시각, nbf는 사용을 시작할 수 있는 시각, iat는 발급 시각입니다. NumericDate는 Unix epoch 이후의 초 단위 값입니다. 1704067200은 2024년 1월 1일 00:00 UTC이며 밀리초 값이 아닙니다.

비교에는 기기 시각을 쓰고 시계 오차에 대한 여유 시간을 적용하지 않습니다. 미래의 iat는 점검할 단서이지만 이 도구가 자동으로 토큰 전체를 무효 처리하지는 않습니다. 실제 허용 여부는 서버의 검증 정책을 따라야 합니다.

디코딩은 복호화나 서명 검증이 아닙니다

Base64url은 암호화가 아니므로 일반적인 서명 JWT의 내용은 키 없이 읽을 수 있습니다. 검증하려면 신뢰할 키와 허용 알고리즘을 설정하고 서명, 발급자, 수신 대상, 시간 조건 등을 확인해야 합니다. 토큰이 주장하는 alg만으로 신뢰 설정을 선택해서는 안 됩니다.

키 URL에 접속하거나 내장 키를 사용하지 않습니다. 다섯 부분의 암호화 JWE, 중첩 JWT, b64: false는 지원하지 않습니다. 입력은 50,000자와 JSON 중첩 64단계로 제한하며 중복 키는 오류로 처리합니다.

예제로 살펴보기

만료된 예제

가상 클레임과 임시 서명이며 실제 인증에 사용할 수 없습니다.

JWT 디코더로 돌아가기

서명 없는 토큰

alg: none이며 세 번째 부분은 비어 있습니다.

JWT 디코더로 돌아가기

Unicode 클레임

다국어 텍스트와 여러 수신 대상을 포함합니다. 서명은 임시 값입니다.

JWT 디코더로 돌아가기

자주 묻는 질문

디코딩에 secret이 필요한가요?

헤더와 페이로드를 읽는 데는 필요하지 않습니다. 공유 비밀 키나 공개 키는 서명 검증에 사용되며, 이 도구는 서명 검증과 JWE 복호화를 수행하지 않습니다.

alg: none은 어떤 뜻인가요?

암호학적 서명이 없는 토큰입니다. 세 번째 부분이 비어 있으므로 마지막 점은 남아 있어야 합니다. 내용이 표시된다는 이유만으로 인증에 사용할 수는 없습니다.

입력한 토큰이 서버에 저장되나요?

디코딩 API로 전송하거나 도구에서 저장하지 않으며 URL에도 넣지 않습니다. 실제 Bearer 토큰은 접근 권한을 가질 수 있으므로 기능을 살펴볼 때는 제공된 가상 예제를 사용하세요.

예제의 서명은 실제로 유효한가요?

아닙니다. 만료 예제의 exp는 2024년 1월 1일 01:00 UTC이고 서명은 임시 값입니다. Unicode 예제도 임시 서명을 사용하며 여러 언어와 aud 배열을 보여 줍니다. 서명 없는 예제는 alg: none입니다.

토큰 형식 오류는 어떻게 고치나요?

세 부분이 모두 있는지, 공백이나 따옴표, 패딩이 섞이지 않았는지 확인하세요. 헤더와 페이로드는 UTF-8 JSON 객체여야 합니다. 중복 키, 빈 서명과 alg의 불일치도 거부됩니다. 오류가 나면 이전 결과는 숨겨집니다.

RFC 7519 · RFC 7515 · RFC 8725

JWT 디코더로 돌아가기