Study/Network

[Network] JWT 개념 및 인증 흐름

jonghne 2023. 12. 6. 16:39

JWT란

JWT란 Json Web Token 의 약자로, 클라이언트와 서버 간의 정보를 안전하게 주고 받기 위한 토큰 기반의 인증 방식 중 하나이다.

 

JWT의 구조는 header.payload.signature로 구성되어 있고, 각각 Base64로 인코딩 되어 있다.

 

 

 

1. header

 

header는 아래의 json과 같이 토큰의 타입(ex) jwt)과 해싱 알고리즘(ex) HS256) 을 지정한다.

 

해싱 알고리즘으로는 시크릿 키를 사용하는 HS256과 공개키/개인키를 사용하는 RSA 가 있는데, 주로 HS256 방식을 사용한다.

{ "alg": "HS256", "typ": "JWT" }

 

 

2. Payload

payload은 클레임(정보)을 담는 부분으로, 아래와 같이 세가지 종류의 클레임이 있다.

  • Registered Claims (등록된 클레임) : 토큰에 대한 정보를 담는 표준 클레임으로 iss(발급자), sub(주체) 등이 있다.
  • Public Claims (공개 클레임) : 사용자 정의 클레임으로, 충돌을 방지하기 위해 URI 형식으로 작성한다.
  • Private Claims(비공개 클레임) : 사용자 정보를 담는 클레임으로 ID, Username 등이 담길 수 있다.

 

쉽게 인증이 완료 된 사용자 정보(ID, 이름)을 넣는 부분이라고 생각하면 된다.

{ "sub": "1234567890", "name": "John Doe", "admin": true }

 

3. signature

클라이언트-서버 간에 해당 토큰이 유효한 토큰인지 확인하기 위해 사용하는 값으로 헤더 + 페이로드 + 시크릿 키를 헤더에 지정된 해싱 알고리즘을 통해 서명한다.


이 시크릿 키는 주로 서버에서 관리하는데, 외부에 노출되지 않도록 주의해야 한다.

 

 

서버의 JWT 인증 방법

인증/인가가 필요한 URL로 사용자의 요청이 들어왔을 때, 서버는 전달 받은 JWT 토큰을 아래와 같은 단계를 통해 유효성을 확인한다.

 

1. JWT 수신

주로 Authorization 헤더에 JWT를 실어서 보낸다. 만약 JWT 토큰이 없다면, 로그인 과정을 수행하게 한다.

 

2. JWT 파싱

Base64로 인코딩 된 JWT를 디코딩해서 헤더, 페이로드, 서명을 나눈다.

 

3. ⭐ 서명 검증

디코딩 된 헤더 + 페이로드와 서버에서 관리하는 시크릿 키를 사용해서 다시 서명을 만들고, 클라이언트로 받은 JWT 서명값과 비교한다.

 

4. 유효성 검사

서명이 유효하다면, 다음으로 JWT의 만료 기간을 확인한다

필요에 의해 발급 시간, 주체, 클라이언트 ID 클레임을 확인해서 유효성 검사를 한다.

 

5. 권한 확인

페이로드의 사용자 정보를 통해서 인가를 수행한다.

API 엔드포인트 접근에 대한 권한이 충분한지 검사하는 과정이다 (Role)

 

클라이언트와 서버 간 JWT 인증 흐름

1. 클라이언트가 서버로 최초 로그인을 시도한다.

 

2. 서버는 해당 사용자에 대한 인증을 수행한다.

 

3. 인증이 완료 되면 JWT를 생성하고, HTTP 헤더나 본문에 포함하여 클라이언트에 반환한다.

 

4. 클라이언트는 서버로 부터 받은 JWT를 쿠키 혹은 로컬 스토리지에 저장한다.

 

5. 이후로 서버로 요청할 때 마다 JWT를 HTTP 헤더 등에 포함시켜서 요청한다.

 

6. 서버는 JWT를 통해 인증 / 인가를 수행한다.

 

 

참고 사이트

https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GAUTHN_jwt
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/