JWT
Json Web Token의 약자
Header, Payload, Signature로 이루어져 있다.
Base64로 인코딩 됨(Binary to Text)
Header는 토큰의 종류와 암호화 알고리즘 등 토큰에 대한 정보가 들어있다.
Payload는 발행일, 만료일, 사용자 ID 등 사용자 검증에 필요한 정보가 들어있다.
Signature는 Base64 인코딩 된 Header와 Payload를 알고리즘으로 싸인한 값이 들어있다. 이 값을 기반으로 토큰이 발급된 뒤로 조작되었는지 확인 가능
. 2개로 나뉘게 된다. 무조건 .(점)이 2개 있음
JWT를 JSON으로 Decoding을 하면 3개의 부분으로 나뉘게 됨. 우리가 읽을 수 있게.
Header, payload를 조금이라도 건드리면 Signature가 깨지게 됨. 조작 여부를 알 수 있음
Signaure의 Secret값이 정확히 일치해야지만 JWT가 위조나 변조되지 않았다고 확신할 수 있음.
따라서 데이터베이스를 따로 볼 필요없이, 토큰 안에 정보를 집어넣어놔도 Signature만 검증할 수 있다면 신뢰할 수 있는 것
Refresh Token, Access Token
두 토큰 모두 JWT 기반
Access Token은 API 요청을 할 때 검증용 토큰으로 사용. 즉, 인증이 필요한 API를 사용할 때는 꼭 Access Token을 Header에 넣어서 보내야 한다.
=> ex) 유저 정보 수정, 회사 채용공고 지원 인원 확인 등등
Refresh Token은 Access Token을 추가로 발급할 때 사용. Access Token을 새로고침(Refresh)하는 기능이 있기 때문에 Refresh Token이라 부른다.
Access Token은 유효기간이 짧고 Refresh Token은 유효기간이 길다.
자주 노출되는 Access Token은 유효기간을 짧게해서 Token이 탈취돼도 해커가 오래 사용하지 못하게 방지할 수 있다.
상대적으로 노출이 적은 Refresh Token의 경우 Access Token을 새로 발급받을 때만 사용되기 때문에 탈취 가능성은 적다.
토큰 발급 과정
[Client -> API Server] ID/Pass 전송
=> "username:password" 값을 base64 인코딩 후 authorization 헤더에 "Basic $token" 형태로 전송
[API Server] Token 검증
[API Server -> Client] 토큰 전송(Refresh + Access)
Refresh Token 사용 과정
[Client -> API Server] Access Token 재발급 URL로 요청
=> [Header]
authorization: "Bearer $refreshToken"
[API Server] Refresh Toekn 검증
[API Server] Access Token 재발급
[API Server -> Client] 토큰 전송(Access)
Access Token 사용 과정
[Client -> API Server] API 요청
=> [Header]
authorization: "Bearer $accessToken"
[API Server] Access 토큰 검증
[API Server -> Database] 데이터 요청
[Database -> API Server] 데이터 응답
[API Server -> Client]데이터 응답
일반적인 토큰 인증 로직
[Client -> API Server] API 요청
[API Server] Access 토큰 검증
[API Server -> Client] Access Token 기간 만료 응답(401)
[Client -> API Server] Access Token 재발급 URL로 요청
[API Server] Refresh 토큰 검증
[API Server -> Client] Access Token 응답
[Client -> API Server] 새로운 Access Token으로 재요청
[API Server -> Database] 데이터 요청
[Database -> API Server] 데이터 응답
[API Server -> Client] 데이터 응답
※ 만약 Refresh 토큰도 만료되었다면 다시 로그인하게 하는 것이 정석