MiServe DevTools

내 스티커

도구를 여기에 고정하세요. 이 브라우저에 저장됩니다.

JWT 디코딩·검증·서명 도구

JSON Web Token을 디코딩해 클레임과 만료 시간을 확인하고, 시크릿이나 공개 키로 서명을 검증하며, HMAC 토큰에 서명합니다.

브라우저에서 실행됩니다. 붙여 넣은 내용은 업로드되지 않습니다.

이 도구에 대하여

JWT란

서명된 JSON Web Token(RFC 7519)은 점으로 이어진 세 개의 Base64URL 문자열, 즉 헤더, 페이로드, 서명으로 이루어집니다. 헤더는 토큰의 서명 방식(alg)을 나타냅니다. 페이로드는 클레임을 담은 JSON 객체로, 클레임은 토큰이 누구에 관한 것인지(sub), 누가 발급했는지(iss), 언제 만료되는지(exp) 같은 정보입니다. 서명은 앞의 두 부분으로 계산합니다.

디코딩은 검증이 아닙니다. 헤더와 페이로드는 인코딩되어 있을 뿐 암호화되지 않았습니다. 토큰을 가진 사람은 누구나 이 페이지처럼 키 없이 내용을 읽을 수 있고, 누구나 원하는 클레임으로 토큰을 만들 수 있습니다. JWT 페이로드에 비밀 정보를 넣지 말고, 서명을 검증하기 전에는 어떤 클레임도 신뢰하지 마세요.

서명 검증

HS256, HS384, HS512는 HMAC입니다. 같은 시크릿으로 서명하고 검증하므로, 검증할 수 있는 쪽은 누구나 위조도 할 수 있습니다. RS256, PS256, ES256과 그 384, 512 변형은 비대칭 방식입니다. 발급자는 개인 키로 서명하고, 검증하는 쪽은 공개 키로 검증합니다. 공개 키는 발급자의 jwks_uri에 JWK Set으로 공개되는 경우가 많습니다.

시크릿을 붙여 넣거나, 공개 키를 PEM, X.509 인증서, JWK 형식으로 붙여 넣으세요. 확인은 브라우저의 Web Crypto API가 수행합니다. 결과는 서명이 유효함, 유효하지 않음, 확인할 수 없음 중 하나입니다. 확인할 수 없는 경우에는 그 이유를 표시합니다. 키가 없거나, 키의 타입이나 곡선이 맞지 않거나, 알고리즘이 지원되지 않거나, 헤더가 "alg": "none"으로 토큰이 아예 서명되지 않았음을 나타내는 경우입니다.

유효한 서명은 필요조건이지만 충분조건은 아닙니다. 실제 서비스는 만료 시간, 발급자, 대상도 확인해야 하며, 토큰 헤더를 그대로 믿지 말고 어떤 알고리즘을 받아들일지 스스로 정해야 합니다.

시간, 예시 토큰, 서명

exp, nbf, iat는 초 단위 Unix 타임스탬프입니다. 클레임 표는 이를 사용자의 시간대에 맞춘 날짜로 보여 주고, 그 위의 배지는 기기 시계를 기준으로 토큰이 만료되었는지, 아직 유효하지 않은지, 또는 얼마나 더 유효한지 알려 줍니다.

페이지를 열면 브라우저에서 생성한 예시 토큰이 표시됩니다. 지금 발급되어 1시간 동안 유효합니다. HS256과 예시 시크릿 devtools-sample-secret-not-for-production으로 서명되어 있어서 검증을 통과합니다. 이 시크릿은 공개되어 있으니 실제 용도로는 사용하지 마세요.

서명은 편집한 헤더와 페이로드, 그리고 HMAC 시크릿으로 토큰을 만듭니다. 테스트와 로컬 개발에 사용하세요. 입력한 토큰, 시크릿, 키는 이 탭 안에만 머무르며, 전송되거나 저장되거나 기록되지 않습니다.

자주 묻는 질문

여기에 JWT를 붙여 넣어도 안전한가요?

토큰은 브라우저에서 JavaScript로 디코딩하고 검증하며, 서버로 전송되지 않습니다. 그래도 만료되지 않은 토큰은 실제로 쓸 수 있는 자격 증명이므로, 토큰을 요구하는 도구는 어떤 것이든 주의해서 사용하고 가능하면 만료된 토큰이나 테스트 토큰을 사용하세요.

누구나 JWT의 내용을 읽을 수 있나요?

네. 헤더와 페이로드는 Base64URL로 인코딩된 JSON일 뿐 암호화되지 않았으므로, 토큰을 가진 사람은 누구나 키 없이 읽을 수 있습니다. 서명은 아무것도 숨기지 않습니다. 서명 키를 가진 쪽이 토큰을 만들었고 이후 변경되지 않았다는 것만 보여 줍니다.

HS256과 RS256의 차이는 무엇인가요?

HS256은 공유 시크릿 하나로 서명과 검증을 모두 하므로, 검증하는 모든 당사자가 토큰을 만들 수도 있습니다. RS256은 개인 키로 서명하고 공개 키로 검증하므로, 발급자만 만들 수 있는 토큰을 여러 서비스가 검증할 수 있습니다.

토큰이 만료된 것으로 표시되는 이유는 무엇인가요?

기기 시계를 기준으로 exp 클레임이 이미 지난 시각이기 때문입니다. 일부 서버는 약간의 시계 오차를 허용하지만, 만료된 토큰은 다시 로그인하거나 리프레시 토큰을 사용해 새로 받아야 합니다.

인코딩의 다른 도구