2018년 4월 11일 수요일

JWT(Json Web Token) 개념 정리

* https://jwt.io/introduction/ 에 설명된 내용 번역 및 정리

1. JWT 개요
  - 서버-클라이언트 또는 서버간 안전한 데이터 통신을 위해 Json Object를 사용하여 간결하게 표준화된 정의(RFC 7519)
  - HMAC 알고리즘 또는 RSA 알고리즘을 이용한 토큰 서명 및 인증 방식임
  - URL의 POST 파라미터 또는 HTTP 헤더를 통해 작은 데이터를 빠르게 주고 받음
  - 데이터베이스 쿼리 또는 세션 처리를 사용하지 않고, 사용자에 대한 모든 필수 정보를 탑재할 수 있음


2. 언제 JWT를 사용해야 하는가?
  - 인증 : Sing Sign On 기능을 이용해서 서비스나 리소스에 접근할 때 사용함 (적은 오버헤드와 서로 다른 도메인간 인증을 쉽게 처리 가능)
  - 정보 교환 : 정보를 요구하거나 보내는 주체가 누구인지 확인이 가능. 또한 헤더나 페이로드를 이용해서 인증서를 계산함으로써 받은 콘텐츠가 변경되지 않았는지 체크 가능함(무결성)


3. JWT 구조 설명
  - 헤더 : 헤더는 기본적으로 알고리즘과 타입 형태로 구분되면 Base64Url로 인코딩됨
  - 페이로드 : 유저와 메타정보 항목에 관해 선언된 요구(Claim), registered, public, private 세가지 항목이 있으며 Base64Url로 인코딩함
    ~ Registered claims : issuer, expiration time, subject, audience 등
    ~ Publci claims : 자유롭게 정의 가능, 충돌 방지 네임스페이스가 포함된 URI로 정의
    ~ Private claims : 공개가 아닌 당사자간 정보를 공유하기 위해 만들어진 사용자 정의 클레임
  - 인증서 : HMAC SHA256 algorithm 알고리즘으로 인증서를 만드는 경우 
    ~ HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)


4. JWT 동작 방식
  1) 클라이언트가 서버에게 POST를 이용해 자격증명 데이터(ID/PW)를 서버에 보냄
  2) 서버는 JWT를 생성함
  3) 클라이언트에게 JWT를 제공
  4) Authorization Header에 JWT를 보냄 (Authorization: Bearer <token>)
  5) JWT 인증서를 체크 후 정보를 추출한 후 사용자에게 정보를 리턴함
  6) 클라이언트에게 응답을 보냄


5. JWT 장점
  -  XML보다 적은 문자 사용, HTML과 HTTP 환경에서 간결하게 통신 가능함
  - 다양한 암호화 알고리즘 사용 가능