
이 글에서는 JWT의 개념부터 구조, 인증 방식, 그리고 AccessToken과 RefreshToken의 역할까지 전체 흐름을 정리해보겠다.
JWT는 사용자 인증에 필요한 정보를 JSON 형태로 담고 있는 토큰이다.
이 토큰은 단순한 문자열이지만 내부에 사용자를 식별할 수 있는 정보가 들어 있으며, 이 정보는 Base64 URL-safe 인코딩으로 직렬화되어 있다.
✅ URL-safe 인코딩이란?
일반적인 Base64 인코딩에서 사용되는
'+','/'문자를 각각'-','_'로 바꿔 URL에서 안전하게 사용하도록 한 방식입니다.
JWT는 총 세 부분으로 구성된다. 각 부분은 .으로 구분되며 다음과 같다.
Header.Payload.Signature
typ)과 사용된 서명 알고리즘 (alg) 정보를 포함한다{
"alg": "HS512",
"typ": "JWT"
}
sub, exp, iat 등의 표준 Claim 외에도, 이메일 같은 커스텀 Claim도 추가할 수 있다.JWT 표준 Claim 예시
| Claim | 설명 |
|---|---|
| iss | 토큰 발급자 |
| sub | 토큰 제목 (유저 식별용) |
| aud | 토큰 대상자 |
| exp | 만료 시간 |
| nbf | Not Before (활성 시작 시간) |
| iat | 발급 시간 |
| jti | 고유 ID (토큰 식별자) |
⚠ 주의
Payload는 암호화되어 있지 않기 때문에, 민감한 정보(비밀번호, 주민번호 등)를 담으면 안 된다! 누구든지 쉽게 디코딩해서 내용을 확인할 수 있다.
JWT를 이용한 인증은 다음과 같은 흐름으로 이루어진다:
요청 시마다 JWT를 Authorization Header에 담아서 서버에 요청✅ Authorization Header 예시:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
JWT 인증 시스템에서는 보안성과 사용자 경험을 고려해 AccessToken과 RefreshToken을 나누어 사용한다
AccessToken만 사용할 경우, 보안 때문에 만료 시간을 짧게 해야 함 → 사용자 경험이 나빠짐 (자주 로그인 필요)
✅ 흐름 요약
- AccessToken 만료 → 서버로 요청 시 실패
- 클라이언트는 RefreshToken으로 새 AccessToken 요청
- 서버는 RefreshToken 유효성 검증 후 새 AccessToken 발급
- 클라이언트는 새 토큰으로 요청 재시도 → 사용자 입장에선 끊김 없이 사용 가능