JWT(Json Web Token) :: JWT 형식, 동작과정
JWT(Json Web Token) :: JWT 형식, 동작과정
1. JWT란?
JWT(Json Web Token)는 웹표준 (RFC 7519)으로
JSON 포맷을 이용해 정보를 가볍고 안전하게 전송하기 위한 Claim 기반의 Web Token.
* 토큰?
토큰이라는 단어의 뜻은 동전. 버스카드나 교통카드라고 생각하면 된다.
근데 이 동전으론 시장에 가서 물건을 사거나 할 수는 없고, 버스를 탈 때 동전을 넣듯이 토큰은 특정한 목적에만 사용할 수 있다.
돈 보다는 바우처하고 비슷하겠다!
즉, 토큰은 일종에 권리를 주는 것이라 할 수 있다.
버스를 탈 수 있는 권리, 지하철을 탈 수 있는 권리를 부여 해주는것. 이 권리를 받는 방법은.. 토큰의 경우 돈을 냈느냐 안냈느냐다. 돈을 내면 토큰을 받고 이 토큰을 내고 버스에 탈 수 있다.
서버에서는 사용자가 결제한 돈도 왔다갔다 한다. 그렇기 때문에 '권한'이라는 것이 중요함!! 인터넷에 사이트를 올리면 전 세계에서 접근 할 수 있기 때문에 사용자나 해커나 이 사이트에 접근을 할 수 있다. 그래서 사용자들의 돈을 보호 하기 위해 본인만 돈을 넣고 빼고 주문을 넣고 결제를 할 수 있게 만들어야 한다. 이 토큰은 여기서 본인 확인 수단이 된다! 로그인을 할 때 id와 pw를 넣고 로그인을 하면 서버가 그것을 확인 해서 id와 pw가 맞으면 이 사용자가 유효한 사용자라는 토큰을 발행 해준다. 그러면 사용자들은 이 토큰을 가지고 해당 사이트의 여러 버스에 해당하는 서비스들을 이용 할 수 있는 것이다.
1-2) JWT의 특징
JWT에서는 토큰 자체에 유저 정보를 담아서 HTTP 헤더에 전달하기에 유저 세션을 유지할 필요가 없다.
1-3) JWT와 세션의 차이
세션 : '세션 저장소'에 접근할 수 있는 세션 아이디 발급.
JWT : 그런거 없음. 대신 Secret Key로 토큰 발급
1-4) JWT의 필요성
✅ Session의 한계
Cookie는 정보를 클라이언트 측에 저장하고 Session은 정보를 서버측에 저장한다.
따라서 유저의 수가 너무 많으면 서버가 과부하되는 문제가 있다.
✅ Scale Out의 한계
서버 확장(scale out)시 세션 정보 동기화 문제.
✅ REST API는 Stateless를 지향
사용자의 상태 정보를 저장하지 않는 형태 (ex 세션, 쿠키)
2. JWT 형식
alg : 해쉬 알고리즘 , typ : 타입
2-2. Payload : not mandatory / Additional information
sub : 어떤 것에 대해 말하는지
name : user의 이름 등
iat : 토큰 생성 시간
exp : 만료 시간
2-3. Signature
Base64 Encoded header + payload
512 bit secret key (base64 Encoded)
3. JWT 동작과정
1. 클라이언트 로그인 요청 POST(id, pw)
2. 서버는 (id, pw)가 맞는지 확인 후 맞다면 JWT를 Secret Key로 생성 후 전달
3. 클라이언트는 Token을 로컬 쿠키에 저장
4. 클라이언트는 서버에 요청할 때 항상 헤더에 Token을 포함시킴
5. 서버는 요청을 받을 때마다 Secret Kye를 사용해Token이 유효한지 검증
- 서버만이 Secret Key를 가지고 있기 때문에 검증 가능
- Token이 검증되면 따로 username, pw를 검사하지 않아도 user identification 가능
6. 서버의 Response