내용을 읽는 것과 인증을 통과하는 것은 다름

JWT 디코더는 토큰의 내용을 읽는 학습 도구입니다. 화면에 디코딩 완료가 나타나도 서버가 그 토큰을 신뢰한다는 뜻은 아닙니다. 현재 도구는 서명을 검증하지 않으며 발급자·대상 서비스·권한 정책까지 확인하지 않습니다.

여기서는 점으로 세 부분을 연결한 JWS 형태의 JWT를 다룹니다. 모든 JWT가 항상 세 부분이라는 뜻은 아닙니다. 암호화된 JWE 형태 등은 이 도구의 세 구간 입력과 구분해야 합니다. 구조와 클레임 정의는 RFC 7519를 참고할 수 있습니다.

유효한 서명 없이도 내용이 보이는 예제

다음은 실제 계정과 관계없는 공개 학습용 문자열입니다. 마지막 구간은 서명 대신 not-signed라는 글자를 넣었습니다.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkZW1vIiwiZXhwIjoxODkzNDU2MDAwfQ.not-signed

현재 디코더에 넣으면 다음 Header와 Payload를 읽을 수 있습니다.

{
  "alg": "HS256",
  "typ": "JWT"
}
{
  "sub": "demo",
  "exp": 1893456000
}

Signature 칸에 값이 보인다는 것은 입력 문자열을 표시했다는 뜻입니다. not-signed를 다른 글자로 바꿔도 앞 두 부분은 그대로 읽을 수 있습니다. 이 토큰은 인증에 사용할 수 있는 정상 서명 토큰이 아닙니다. 학습 예제를 실제 API로 보내 인증을 시험할 필요도 없습니다.

HS256 생성기에 넣는 입력의 조건

JWT 생성기는 현재 HS256용 예제를 만들며 Header와 Payload를 JSON 객체로 입력받습니다. 현재 구현의 Secret 입력은 UTF-8 기준 32~4096바이트 범위를 검사하고, exp, nbf, iat가 있으면 정수인 초 단위 값을 요구합니다. 이는 이 도구의 입력 조건이며 RFC가 모든 NumericDate를 정수만으로 제한한다는 뜻은 아닙니다.

한글 한 글자와 영문 한 글자는 UTF-8 바이트 길이가 다를 수 있습니다. 또 길이가 32바이트를 넘는다는 사실만으로 추측하기 어려운 키가 되는 것은 아닙니다. 생성기의 임의 Secret 기능도 학습용으로 사용하고, 운영 서명 키를 웹 도구에 옮겨 넣지 않습니다.

현재 서명 함수는 Secret의 UTF-8 바이트로 HMAC SHA-256을 계산합니다. 다른 라이브러리에서 Secret을 Base64나 hex로 먼저 해석했다면 같은 화면 문자열이어도 실제 키 바이트가 달라질 수 있습니다. 테스트 결과를 비교할 때는 알고리즘과 키 표현 방식을 함께 맞춥니다.

시간은 초 단위와 경계를 함께 확인

exp = 1893456000은 UTC 기준 2030-01-01 00:00:00입니다. 한국 시간으로 보면 오전 9시입니다. 브라우저의 현지 시간 표시를 켠 경우에는 그 브라우저의 시간대가 적용되므로 사용자마다 다르게 보일 수 있습니다.

iat는 발급 시점, nbf는 사용 가능 시작 시점, exp는 만료 시점을 나타냅니다. 이 도구의 요약에는 iat와 exp가 표시되며, nbf가 Payload에 있어도 서버 인증처럼 유효성을 판정하지 않습니다.

현재 디코더의 만료 표시는 exp < 현재 초일 때 만료로 분류합니다. 따라서 exp와 현재 초가 정확히 같은 경계에서는 0분 후 만료로 보일 수 있습니다. 검증기는 적용 정책과 허용 시계 오차에 따라 처리하지만, 기본 만료 판단에서 이 경계를 놓치면 안 됩니다. 이 글은 표시 한계를 설명한 것이며 해당 도구의 경계 처리를 수정 완료했다는 뜻은 아닙니다.

서버 검증에서 별도로 확인할 것

서버에서는 허용한 알고리즘과 신뢰할 키로 서명을 확인하고, 서비스가 요구하는 발급자·대상·시간·필수 클레임을 검증합니다. 헤더의 alg 값을 그대로 신뢰해 검증 방식을 정하거나, Payload의 role이 보인다는 이유로 권한을 부여하지 않습니다. 구체적인 보안 기준은 JWT 검증 권고 RFC 8725에 정리돼 있습니다.

일반적인 서명 JWT의 앞 두 구간은 Base64URL로 읽을 수 있으므로 비밀번호를 숨기는 저장소가 아닙니다. 디코더의 JSON 다운로드에는 현재 원본 토큰 문자열도 포함됩니다. 실제 토큰을 넣었다면 다운로드·클립보드·캡처가 또 다른 사본이 되므로, 처음부터 가상 값으로 연습하는 편이 좋습니다.

학습 확인 기준은 가상 Header/Payload가 예상대로 읽히는지, 만료 시간 단위가 맞는지, 디코딩 결과를 서명 검증과 혼동하지 않는지입니다. 인코딩 자체를 먼저 연습하려면 Base64·URL·JSON 사용 예제를 참고하세요.