JWT에서 Access Token과 Refresh Token이 나뉘어 있는 이유와 jti의 역할
웹 서비스에서 사용자 인증을 위해 JWT(JSON Web Token)을 사용하는 경우가 많습니다.
이때 흔히 access_token과 refresh_token이라는 두 개의 토큰이 함께 등장하죠.
처음에는 “그냥 access_token 하나로 인증하면 되는 거 아닌가?”라는 의문이 들 수 있습니다.
저도 그랬고요.
그런데 이 둘을 굳이 나눈 데에는 명확한 이유가 있습니다.
그리고 jti라는 필드도 의외로 중요한 역할을 합니다.
이 글에서는 그 이유를 정리해보겠습니다.
🧾 access_token과 refresh_token의 차이점
| 항목 | access_token | refresh_token |
|---|---|---|
| 목적 | 리소스 접근 인증 | access_token 재발급 |
| 수명 | 짧음 (예: 15분) | 김 (예: 2주, 1개월) |
| 서버 저장 여부 | 보통 저장 안 함 | 저장하거나 jti로 추적 가능 |
| 노출 시 위험 | 제한적 (짧은 수명) | 매우 위험 (갱신 가능하므로) |
access_token은 실제 API 요청에 사용되며, 만료 시간이 짧은 것이 일반적입니다. 보안 사고 발생 시 피해를 줄이기 위함이죠.
refresh_token은 사용자 경험(UX)을 위해 존재합니다. 사용자가 매번 로그인하지 않아도 refresh_token을 사용해 자동으로 access_token을 갱신할 수 있도록 해줍니다.
- 짧은 수명으로 자주 로그인 필요 → ❌ UX 나빠짐
- 긴 수명으로 유지하면 도난 시 위험 → ❌ 보안 취약
🔑 해결책: 👉 인증에 짧은 수명의 access_token 사용 👉 갱신은 긴 수명의 refresh_token으로만 가능하게
이렇게 하면 보안과 UX를 모두 잡을 수 있는 구조가 됩니다.
🧬 jti (JWT ID)의 역할은? JWT 내부에는 jti라는 필드를 포함할 수 있습니다.
1
2
3
4
5
6
7
{
"sub": "user123",
"type": "access",
"jti": "18a8c8c0-c987-4c15-aece-8063bebd2068",
"exp": 1747209875
}
- JWT 고유 ID로, UUID 형식이 많습니다.
- 토큰마다 유일한 ID를 부여해 서버에서 해당 토큰을 추적하거나 식별할 수 있습니다.
- 특히 refresh_token에는 jti를 저장해두면, 블랙리스트 관리가 가능합니다.
🧭 JWT 인증 흐름 요약 (시퀀스 다이어그램)
✅ 결론 ** **JWT에서 access_token과 refresh_token을 분리하는 이유는 **보안과 사용자 경험을 동시에 만족시키기 위함**입니다. 그리고 jti는 각 토큰을 **서버에서 고유하게 식별하고 관리할 수 있게 해주는 열쇠**입니다. ** **다음번에 JWT 관련 인증 시스템을 설계하신다면, access_token, refresh_token, 그리고 jti를 어떻게 설계하고 저장할지를 꼭 함께 고민해보세요. **

