

JWT란?
JWT의 구조
일반적으로 아래의 구조를 지니며 왼쪽부터 Header, Payload, Signature를 의미함
xxxx.yyyy.zzzz
Header : 토큰 유형 + 사용중인 서명 알고리즘으로 구성됨
{
"alg": "HS256",
"typ": "JWT"
}
Base64Url로 인코딩되어 xxxx 부분을 구성함
서명 알고리즘은 SHA256, RSA 등이 있음
헤더에서 설정한 서명 알고리즘은 아래 Signature가 사용할 알고리즘 방식
Payload : 토큰에서 사용할 정보 조각들인 Claim이 담겨 있음
{
"iss": "https://auth.myapp.com", // Registered Claim - 토큰 발급자
"sub": "user_12345", // Registered Claim - 사용자 ID
"aud": "https://api.myapp.com", // Registered Claim - 토큰 대상
"exp": 1718000000, // Registered Claim - 만료 시간 (UNIX timestamp)
"iat": 1717996400, // Registered Claim - 발급 시간
"jti": "jwt-abcde-12345", // Registered Claim - JWT 고유 식별자
"email": "jisu@example.com", // Public Claim - 일반 사용자 정보
"name": "Kim Jisu", // Public Claim - 사용자 이름
"https://myapp.com/user-preferences": { // Public Claim - 네임스페이스 지정
"theme": "dark",
"language": "ko"
},
"role": "ROLE_USER", // Private Claim - 내부에서만 해석 가능한 사용자 권한
"userId": "12345", // Private Claim - 서비스 내부 사용자 ID
"isPremium": true // Private Claim - 프리미엄 사용자 여부
}
Signature : Header + Payload와 서버가 갖고 있는 유일한 key값을 Header에서 정의한 알고리즘으로 암호화
AccessToken
RefreshToken
왜 RefreshToken이 필요한가? : AccessToken은 보안에 취약하다!
AccessToken/RefreshToken 재발급 원리
로그인하면 AccessToken, RefreshToken 모두 발급됨
인증 필요한 API 요청 시 토큰 검사 진행
| case | 동작 |
|---|---|
| AccessToken, RefreshToken 모두 만료 | 재로그인해 새로 발급 |
| AccessToken만 만료됨 | RefreshToken 검증 후 AccessToken 재발급 |
| RefreshToken만 만료됨 | AccessToken 검증 후 RefreshToken 재발급 |
| 두 토큰 모두 유효함 | 정상 처리 |
로그아웃 시 두 토큰 모두 만료 처리

사용자가 ID, PW 이용해서 로그인함
서버에서 회원 DB에 저장된 값과 비교
로그인이 완료되면 AccessToken, RefreshToken을 발급함
사용자는 RefreshToken은 쿠키나 웹스토리지에 저장하고 AccessToken을 요청 Header에 보내 요청 보냄
AccessToken에 대한 검증 진행 후 통과하면 맞는 데이터를 보냄
만약 AccessToken이 만료된 경우
사용자는 이전처럼 AccessToken을 요청 Header에 보내 요청 보냄
Authorization 필드에 작성해서 요청 보냄
보통 Bearer 토큰 방식으로 사용됨
예시
형식 : Authorization: <인증방식> <자격증명>
Authorization: Bearer 123456(AccessToken위치)
서버는 AccessToken이 만료됨을 확인하고 권한없음을 신호 보냄
사용자는 RefreshToken과 AccessToken을 함께 서버에 보냄
서버는 RefreshToken을 사용자 DB에 저장된 토큰값과 일치하는지 비교 후 일치하고 유효 기간이 지나지 않았을 경우 새 AccessToken을 발급해줌
서버는 새로운 AccessToken을 Header에 실어 다시 API 요청 진행
사용자는 새 AccessToken을 받은 후 새 API 요청을 보냄
JWT란 무엇이며 어떤 흐름을 가질까?
🌐 JWT 토큰 인증이란?(쿠키 vs 세션 vs 토큰)
Developing token authentication using ASP.NET Core