- 인증에 필요한 정보들을 암호화 시킨 JSON 토큰
- Header와 Payload를 가지고 Signature 를 생성하므로 데이터 위변조를 막을 수 있다.
- 인증 정보에 대한 별도 저장소가 필요 없음
- 토큰 자체에 기본 정보와 전달 정보, 서명 등이 들어있다.
- 클라이언트 인증 정보를 저장하는 세션과 다르게 Stateless 하다.
- 다른 로그인 시스템에 접근 및 권한 공유 가능
JWT 인증 방식
- 클라이언트가 로그인 인증 요청
- 서버에서 인증 요청을 받으면 Header, Payload, Signature를 정의
- 서버는 정의한 Header, Payload, Signature를 각각 Base64로 암호화 하여 JWT 생성
- 서버는 JWT를 쿠키에 담아 클라이언트에게 발급
- 클라이언트는 발급 받은 JWT를 로컬 스토리지에 저장
- 이 후, 서버가 요청할 때마다 Authorization Header에 Access Token을 담아서 보낸다.
- 서버는 클라이언트가 Header에 담아 보낸 JWT 가 서버에서 발행한 토큰인지 확인
- 서버에서 발행한 토큰이라면 인증 통과를 시키고, Payload에 들어있는 유저 정보를 select 하여 클라이언트에게 돌려준다.
- 만약 클라이언트가 서버에 요청을 했는데, Access Token 시간이 만료되었다면, 클라이언트는 Refresh Token을 이용하여 Token 재발급을 요청한다.
- 서버는 새로운 Access Token을 발급해줌
<aside>
💡 **JWT의 진짜 목적
- JWT는 Base 64로 암호화 하기에 쉽게 복호화 할 수 있다.
- 그렇기에 Payload 에 비밀번호 같은 민감한 정보는 넣지 말아야 한다.
- 이런 점으로 보았을 때, 토큰은 정보 보호가 아닌 위조 방지가 진짜 목적인 것.
- Signature 에 사용된 비밀 키가 노출되지 않는 이상 데이터를 위조해도 Signature 부분에서 바로 걸러지기 때문이다.**
</aside>
JWT Token 종류