본문 바로가기

Web

[Authorization] JWT 토큰 이해하기

서버 기반 인증 시스템

기존의 인증 시스템은 서버 기반으로 서버 측에서 유저의 정보를 기억하고, 세션을 유지하기 위해서 메모리 / 디스크 / 데이터베이스 등이 사용된다.

문제점

세션

서버가 유저의 인증 기록을 남기는 것을 세션이라고 부른다. 로그인하는 유저의 수가 늘어나면 메모리 또는 데이터베이스의 성능에 무리를 줄 수 있다.

 

확장성

서버를 확장하는 것이 어려워진다. 세션을 서버에 저장하면서 서버를 확장하는 것은 과정이 매우 복잡하다.

토큰 기반 인증 시스템

토큰 기반 인증 시스템은 Stateless 하다고 한다. 유저의 인증 정보를 서버에 담아두지 않기 때문이다.

 

장점

Stateless & Scalability

상태가 없기 때문에 서버를 여러대로 확장할 수 있다. 특히 Kubernetes 상에 pod로 올라간다고 생각했을 때, stateless하기 때문에 pod가 죽었을 때도 문제없고 확장성이 있기 때문에 autoscaling을 적극적으로 확용할 수 있다.

JWT(Json Web Token)

토큰 기반 인증 시스템의 구현체로 두 개체에서 JSON 객체를 사용하여 가볍고 안전성 있게 전달한다.

특징

- 많은 프로그래밍 언어에서 지원된다.

- 자가수용적 (self-contained) : JWT는 필요한 모든 정보를 자체적으로 지니고 있다.

- 쉽게 전달이 가능하다.

 

 

Header

두가지의 정보를 지니고 있음

- typ: 토큰의 타입을 지정 (JWT)

- alg: 해싱 알고리즘을 지정 (HMAC, SHA256, RSA)

 

Payload

토큰에 담을 정보가 들어있음. 정보의 한 조각을 claim이라고 부르고, name / value의 한 쌍으로 이루어짐

 

- Registered Claim

서비스에서 필요한 정보들이 아니라 토큰에 대한 정보들을 담기 위한 이미 정해져있는 클레임

iss(토큰 발급자), sub(토큰 제목), aud(토큰 대상자), exp(토큰의 만료시간)
nbf(토큰의 활성 날짜), iat(토큰 발급 시간), jti(JWT의 고유 식별자)

 

- Public Claim

충돌이 방지된 이름을 가지고 있어야 하므로 보통 URI 형식으로 짓는다.

 

- Private Claim

클라이언트와 서버 간에 사용되는 클레임 이름

 

Signature

Header의 인코딩 값과 Payload의 인코딩값을 합친 후 주어진 Secret Key로 해쉬를 하여 생성

 

(참고)

 

[JWT] JSON Web Token 소개 및 구조 | VELOPERT.LOG

지난 포스트에서는 토큰 기반 인증 시스템의 기본적인 개념에 대하여 알아보았습니다. 이 포스트를 읽기 전에, 토큰 기반 인증 시스템에 대해서 잘 모르시는 분들은 지난 포스트를 꼭 읽어주세

velopert.com

'Web' 카테고리의 다른 글

[Vue.js] Named Routes / 동적 라우팅  (0) 2020.10.01
[Vue.js] 시작하기  (0) 2020.09.17