🔐 JWT
JWT란? Json Web Token의 약자로 인증에 필요한 정보를 암호화시킨 JSON 토큰이다.
JSON 데이터를 Base64 URL-safe Encode로 인코딩하였고, 토큰 내부에 위조 방지를 위한 전자서명도 들어있다.
🧷 구조 (Header.Payload.Signature)
- Header : 타입과 해시 알고리즘(ex. HMAC SHA256, RSA)의 종류를 담고 있다.
- Payload : 사용자 권한, 정보 등을 담고 있다. Key-Value로 이루어진 정보를 Claim이라고 한다.
- Signature : 헤더에서 정해진 알고리즘과 비밀키를 사용해서 암호화한 인증을 위한 데이터이다.
🧐 왜 JWT를 사용할까?
Base64를 통해서 암호화한다는 것을 알기 때문에 누구나 Payload를 쉽게 복호화할 수 있다.
따라서 Payload에는 민감한 정보를 담지 않는다.
그렇다면 왜 JWT를 사용할까? 바로 JWT의 목적은 보안이 아닌, 인증이기 때문이다.
JWT 자체가 탈취되는 경우를 방지하기 위해서 쓰이는 방법이 Access Token / Refresh Token 방식이다.
🔃 Access Token / Refresh Token 방식
토큰 자체가 탈취되면, 토큰을 획득한 모든 사람이 권한 접근이 가능하기 때문에 보안상에 문제가 발생한다.
JWT는 발급한 뒤 삭제가 불가능하기 때문에 유효시간을 설정해서 탈취 문제에 대응한다.
여기서 발생하는 문제점은 유효시간이 짧으면 자주 토큰을 발급해야 하고, 길면 보안이 취약해진다.
Access Token / Refresh Token 방식을 통해서 이 문제를 해결할 수 있다.
💡 Access Toke과 Refresh Token
두 토큰 모두 같은 Json Web Token이나 유효기간과 역할이 다르다.
Access Token은 짧은 유효기간을 가진 접근용 토큰이고, Refresh Token은 긴 유효기간을 가진 발급용 토큰이다.
🌊 Flow
🧐 어떻게 재발급을 하는 걸까?
1️⃣ 로그인 같은 과정은 Access Token과 Refresh Token 모두 발급한다.
- 서버는 Refresh Token은 DB에 저장하고, 클라이언트는 두 토큰을 쿠키 혹은 스토레지 영역에 보관한다.
2️⃣ 클라이언트가 인증이 필요한 API에 접근하면 토큰부터 검사한다.
- Access Token과 Refresh Token 모두 만료 : 예외 발생 (재 로그인)
- Access Token 만료, Refresh Token 유효 : Refresh Token을 검증하여 Access Token 재발급
- Access Token 유효, Refresh Token 만료 : Access Token을 검증하여 Refresh Token 재발급
- Access Token과 Refresh Token 모두 유효 : API 접근 허용
3️⃣ 로그아웃 시 Access Token과 Refresh Token 모두 만료시킨다.
'개인 공부 > TIL' 카테고리의 다른 글
TIL : N+1 문제, Fetch 전략 (18) (0) | 2022.12.07 |
---|---|
TIL : StringUtils 사용하기 (17) (0) | 2022.12.01 |
TIL : 서버 인증 방식 (쿠키, 세션, 토큰) (15) (0) | 2022.11.30 |
TIL : Swagger 사용하기 (14) (0) | 2022.11.28 |
TIL : @Modifying, Junit5 (13) (0) | 2022.09.27 |
댓글