Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

JWT의 개념 및 활용 본문

대딩코딩/웹개발 스터디

JWT의 개념 및 활용

시데브 2024. 5. 18. 23:55

 

 사용자가 서버에 접근할 때 이 사용자가 인증된 상태인지 확인하는 대표적인 방법으로 서버 기반 인증과 토큰 기반 인증이 존재한다. 이 중에서 토큰 기반 인증에 대해서 살펴보자.

 

토큰 기반 인증

  • 토큰: 서버에서 클라이언트를 구분하기 위한 유일한 값
  • 서버가 토큰을 생성해서 클라이언트에 제공 -> 클라이언트가 이 토큰을 가지고 있다가 토큰과 함께 request를 보냄 -> 서버는 이 토큰만 보고 유효한 사용자인지 검증

 

토큰을 전달하고 인증받는 과정

  1. (클라이언트 -> 서버) 로그인 요청
  2. (서버 -> 클라이언트) 토큰 생성 후 응답
  3. (클라이언트) 토큰 저장
  4. (클라이언트 -> 서버) 토큰 정보와 함께 요청
  5. (서버) 토큰 검증
  6. (서버 -> 클라이언트) 응답

 

토큰 기반 인증의 특징

 토큰 기반 인증은 무상태성, 확장성, 무결성의 특징을 가진다.

  • 무상태성: 클라이언트의 인증 정보를 저장하거나 유지할 필요가 X -> stateless
  • 확장성: 서버를 확장할 때, 상태 관리를 신경 쓸 필요가 없으니 확장에도 용이
  • 무결성: HMAC(Hash-based Message Authentication) - 토큰을 발급한 이후에 토큰 정보를 변경하는 행위 불가능 -> 토큰의 무결성 보장

 

JWT

  • HTTP 요청 헤더 중에 Authorization 키값에 Bearer + JWT 토큰값을 포함해야 함

JWT의 구조

aaaa.bbbb.cccc

-> aaaa: 헤더

-> bbbb: 내용

-> cccc: 서명

 

헤더

  • 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담는다.
  • typ: 토큰의 타입 지정
  • alg: 해싱 알고리즘 지정
{
  "typ": "JWT"
  "alg": "HS256"
}

-> JWT 토큰, HS256 해싱 알고리즘을 사용한다는 의미

 

내용

  • 토큰과 관련된 정보를 담음
  • 내용의 한 덩어리 -> claim: 키값의 한 쌍으로 이루어져 있음
  • 클레임은 등록된 클레임, 공개 클레임, 비공개 클레임으로 나눌 수 있음

등록된 클레임(registered claim)

  • 토큰에 대한 정보를 담는 데 사용
이름 설명
iss 토큰 발급자(issuer)
sub 토큰 제목(subject)
aud 토큰 대상자(audience)
exp 토큰 만료 시간(expiration). 시간은 NumericDate 형식(ex: 140849147370), 항상 현재 시간 이후로 설정
nbf 토큰의 활성 날짜와 비슷한 개념. nbf는 not before를 의미. NumericDate 형식. 해당 날짜가 지나기 전까지 토큰 처리 X
iat 토큰이 발급된 시간으로 iat는 issued at
jti JWT의 고유 식별자. 주로 일회용 토큰에 사용

공개 클레임(public claim)

  • 공개되어도 상관없는 클레임
  • 충돌 방지할 수 있는 이름 가져야 하며, 보통 클레임 이름을 URI로 지음

비공개 클레임(private claim)

  • 공개되면 안 되는 클레임
  • 클라이언트와 서버 간의 통신에 사용
{
  "iss": "ajufresh@gmail.com"           //등록된 클레임
  "iat": 16622370878,			//등록된 클레임
  "exp": 16622372678,			//등록된 클레임
  "http://psy.com/jwt_claims/is_admin": true,	//공개 클레임
  "email": "ajufresh@gmail.com",	//비공개 클레임
  "hello": "안녕하세요!"                   //비공개 클레임
}

 

서명

  • 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도
  • 헤더의 인코딩 값과 내용의 인코딩 값을 합친 후에 주어진 비밀키를 사용해 해시값 생성

 

토큰 유효기간

  • 토큰이 노출되었을 때를 대비하여 토큰에 유효기간 설정

리프레시 토큰

  • 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하기 위해 사용
  • 액세스 토큰과 별개의 토큰
  • 액세스 토큰의 유효 기간을 짧게 설정하고, 리프레시 토큰의 유효 기간을 길게 설정
  1. (클라이언트 -> 서버) 클라이언트가 서버에 인증 요청
  2. (서버 -> 클라이언트) 액세스 토큰 & 리프레시 토큰 응답
  3. (서버 -> 데이터베이스) 리프레시 토큰 저장
  4. (클라이언트 -> 서버) 요청
  5. (서버 -> 클라이언트) 토큰 유효성 검사 & 응답
  6. (클라이언트 -> 서버) 요청, 만료된 액세스 토큰 포함된 경우
  7. (서버 -> 클라이언트) 토큰 만료 응답
  8. (클라이언트 -> 서버) 액세스 토큰 발급 요청, 리프레시 토큰 포함
  9. (서버 -> 데이터베이스) 리프레시 토큰 조회 & 유효성 검사
  10. (서버 -> 클라이언트) 새로운 액세스 토큰 응답

참고자료

  • 스프링 부트 3 백엔드 개발자 되기, 신선영, 골든래빗, 2023.05.12