JWT 토큰 구조와 만료 시간 확인하는 법
JWT가 점(.)으로 나뉜 세 부분으로 어떻게 이뤄지는지, exp·iat 같은 시간 값을 읽는 법, 개발할 때 조심할 점을 정리했습니다.
2026년 10월 5일 · 읽는 데 약 2분
JWT는 세 부분입니다
로그인한 사용자를 알아보는 데 쓰는 JWT(JSON Web Token)는 eyJ로 시작하는 긴 문자열이고, 점(.)으로 나뉜 세 부분으로 되어 있습니다.
- 헤더: 어떤 알고리즘(alg)으로 서명했는지
- 내용(payload): 사용자 id(sub), 발급 시각(iat), 만료 시각(exp) 같은 값
- 서명: 헤더와 내용이 바뀌지 않았음을 서버의 비밀 키로 증명하는 값
JWT는 암호화가 아닙니다
헤더와 내용은 Base64URL로 바꿔 놓았을 뿐이라 누구나 풀어 읽을 수 있습니다. 그래서 JWT 내용에 비밀번호나 주민등록번호 같은 민감한 값을 넣으면 안 됩니다. 서명은 내용이 바뀌지 않았다는 것만 보증합니다.
시간 값 읽기
exp, iat, nbf는 1970년 1월 1일부터 지난 초(Unix 시간)로 적힙니다. 1759449600 같은 숫자로는 언제인지 알기 어려워서, "토큰이 왜 벌써 만료됐지?"를 확인하려면 날짜로 바꿔 봐야 합니다.
- exp: 이 시각이 지나면 쓸 수 없습니다(만료).
- iat: 토큰을 발급한 시각입니다.
- nbf: 이 시각 전에는 쓸 수 없습니다.
파일모리 JWT 디코더로 확인하기
토큰을 붙여 넣으면(앞에 Bearer 가 붙어 있어도 됩니다) 맨 위에 "유효함 (3시간 후 만료)" 또는 "만료됨 (2일 전)"이 바로 나오고, 발급·만료 시각을 날짜로 보여 줍니다. 세 부분은 색으로 나눠 보여 줍니다. 서명이 없는 alg: none 토큰은 경고합니다.
토큰은 브라우저 안에서만 풀고 어디로도 보내지 않습니다. 그래도 실제 서비스 토큰은 확인한 뒤 화면을 닫아 두세요.
개발할 때 조심할 점
- 서버는 반드시 서명을 검증해야 합니다. 디코더처럼 내용을 읽기만 하면 위조된 토큰도 통과합니다.
- alg: none 을 받아 주는 서버 설정은 위험합니다.
- 서버 시계가 틀리면 멀쩡한 토큰이 만료로 보일 수 있습니다. 몇 초 정도 여유를 두는 경우가 많습니다.