JWT : JSON Web Tokens
jwt
제이슨 웹 토큰
URL-safe json
클라이언트 인즈과 인가를 위한 메커니즘이 필요한데 MSA의 인증 인가에 사용할수있는 서명된 json
서버측 부하를 낮출수있고 능률적인 접근 권한 관리를 할수있으면 분산 환경에 잘 대응할수있다
---
-서버기반 인증
문제점
사용자가 많아 질수롤 메모리 과부하 문제가 발생
---
토큰 기반 인증원리
1 사용자 로그인
2 서버측에서 로그인 인증하고 맞을경우 클라이언트 측에 signed 토큰을 발급해준다
signed 란? 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature를 담고 있다는 것을 의미
3 클라이언트 측에서 서버로 전달받은 토큰을 저장하고 서버에 요청할때마다 해당 토큰을 함께 서버에 전달
4 서버는 요청이 올때 마다 토큰을 검증한다
---
토큰 기반 인증의 장점
1 확장성이 뛰어나다. 서버가 늘어나도 토큰을 인증하는 방식만 알고 있다면 영향이 없다.
2 클라이언트가 서버로 요청할 때 더이상 쿠키를 전달하지 않기 때문에 쿠키를 사용함으로써 발생하는 취약점이 사라진다.
3 물론 토큰을 사용하는 환경에서도 취약점이 존재할 수 있으니 대비해야 한다.
4 다른 서비스에서도 권한을 공유할 수 있다. (ex. OAuth 를 통해 Facebook 에서 인증하고 Facebook의 일부 권한만 사용가능)
5 CORS 문제가 해결되나. 어떤 도메인에서도 토큰만 유효하다면 처리가 가능하다.
6 JWT는 웹표준 RFC7591에 등록되어 있다. 따라서 여러 환경에서 지원이 가능하다. (.NET, Ruby, Java, Node.js, Python 등)
단점
필드가 추가되면 토큰이 커질수있다
모든 요청에대해 토큰이 전송되므로 데이터 트리팩 크기에 영향이 있다
---
구조
header.payload.signature 로 이루어져 있다
header
토큰의 타입(type)과 해싱 알고리즘(alg)을 지정
const header = { "type": "JWT", "alg": "HS256" };
payload
토큰에 담을 정보
signature
header의 인코딩값, 정보의 encoding 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성함