Json Web Token의 약자로
당사자 간에 정보를 JSON 객체로 안전하게 전송하기 위한 간결하고
그 문자안에 정보들을 정의하는 토큰 기반 인증이다.
권한 부여
JWT가 가장 많이 사용되는 예.
사용자가 로그인하여 JWT를 발급받으면 해당 토큰으로 허용되는 경로,
서비스 및 리소스에 엑세스 할 수 있다.
정보 교환
JWT는 당사자 간에 정보를 안전하게 전송하는 좋은 방법이다.
예를 들어 공개 / 개인 키 쌍을 사용하여 JWT에 서명할 수 있기 때문에 발신자가 누구인지 확인 할 수 있다.
헤더와 페이로드를 사용하여 서명을 계산하므로 콘텐츠가 변조되지 않는지도 확인 가능하다.
Header
header는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다
payload
서버에서 첨부한 사용자 권한 정보와 데이터가 담겨 있다.
Signature
header, payload를 Base64 URL-safe Encode를 한 이후 Header에 명시된 해시함수를 적용하고 캐인키로 서명한 전자서명이 담겨있다.
사용자가 ID, PW를 입력해 서버에 로그인 인증을 요청한다.
서버에서 클라이언트로부터 인증 요청을 받으면, Header, Payload, Signature를 정의한다.
Header, Payload, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에 발급한다.
클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다.
API를 서버에 청할때 Authorization header에 Access Token을 담아 보낸다.
서버는 클라이언트가 Header에 보낸 JWT가 내 서버에서 발행한 토큰인지 일치여부를 확인하여 일치하면 통과시켜주고 아니라면 차단해야한다.
클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 서버로 부터 새로운 액세스 토큰을 발급 받는다.
Header와 Payload를 가지고 Signature를 생성하므로 데이터 위변조를 막을 수 있다.
인증 정보에 대한 별도의 저장소가 필요없다.
클라이언트 인증 정보를 저장하는 세션과 다르게, 서버는 무상태가 된다.
확장성이 우수하다.
참조 :
Introduction to JSON Web Tokens
JWT 토큰 인증 이란? - 💯 이해하기 쉽게 정리