하지만 뭔가 세련된 방법이 없을까 고민다하가 튜터님의 조언으로 JWT라는 것을 사용해 보기로 했다.
JSON Web Token
들어가기 전에 JSON Web Token의 개념을 알아두자.
JWT??
JSON Web Token은 공개된 업계 표준인 RFC 7519 방식으로 양 측의 클레임(Claims)을 안전하게 한다. JWT.IO를 사용하여 JWT를 디코드, 검증 및 생성할 수 있다.
Claim이라는 용어가 처음에 낯설었지만 서버와 클라이언트가 주고받는 정보나 메세지 정도로 생각하면 된다.
JSON 객체로된 클레임은 디지털로 서명되었기 때문에 검증되고 신뢰할 수 있다고 한다.
또한 다음과 같은 개념을 가진다.
Compact: JWT는 크기가 작기 때문에 URL, POST 파라미터 또는 HTTP Header에 포함될 수 있다. 크기가 작아 전송 속도 또한 빠르다고 할 수 있다.
Self-contained: JWT는 Payload에 필요한 데이터를 포함한다. 따라서 토큰을 생성할 때 데이터베이스에서 정보를 가져오면 그 다음부터는 데이터베이스에 질의를 하지 않아도 된다.
언제 JWT를 사용할까?
Authentication: JWT를 사용하는 가장 일반적인 시나리오다. 유저가 처음 로그인을 하면, 유저 정보를 포함한 JWT를 생성해 발급해준다. 그 후 유저는 각 요청에 발급받은 토큰을 포함해 보내는데, 서버에서 토큰을 기반으로 유저의 정보, 허용되는 경로 등의 정보를 데이터베이스의 접근없이 알 수 있다. 또한 세션을 유지하지 않아도 되므로 서버의 비용이 줄어들 수 있다.
Information Exchange: JWT는 공개 키나 비밀 키로 서명할 수 있기 때문에 안전하게 정보를 교환할 수 있다. 게다가 서명이 헤더와 페이로드를 사용하여 계산되므로 내용이 변경되었는지도 판별할 수 있다.
JWT의 구조
JWT는 점(.)으로 구분되는 세가지 요소를 가진다.
Header
Payload
Signature
그래서 결과적으로 xxxxx.yyyyy.zzzzz 형태를 가지게 된다.
Header
JWT의 첫 번째 부분은 Header 로, 헤더는 2가지 속성 값을 가진다.
alg: 해싱 알고리즘. 보통 HMAC SHA256 혹은 RSA가 사용된다.
typ: 토큰의 타입 = JWT
다음과 같이 Header를 생성할 수 있다.
1 2 3 4
{ "alg": "HS256", "typ": "JWT" }
Payload
두 번째 부분은 처음에 클레임을 포함하는 Payload가 들어가게 된다.
클레임은 3가지로 구분할 수 있는데, 다음과 같다.
Reserved claims: 이것은 필수는 아니지만 JWT를 사용함에 있어 권장되는 미리 정의된 클레임 세트이다. iss(발행자), exp(만료 시간), sub(주제), aud(고객) 등을 포함한다.
Public claims: 이것은 JWT사용자끼리 충돌을 방지하기 위한 값을 포함한다. 보통 충돌을 방지하기 위한 네임스페이스를 사용한다.