일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 오블완
- 지도학습
- OpenAI
- Machine Learning
- 분류
- LLM
- GPT-4
- deep learning
- regression
- 딥러닝
- 해커톤
- ChatGPT
- LG
- PCA
- gpt
- 머신러닝
- 티스토리챌린지
- LG Aimers
- LG Aimers 4th
- Classification
- AI
- 회귀
- supervised learning
Archives
- Today
- Total
SYDev
JWT의 개념 및 활용 본문
사용자가 서버에 접근할 때 이 사용자가 인증된 상태인지 확인하는 대표적인 방법으로 서버 기반 인증과 토큰 기반 인증이 존재한다. 이 중에서 토큰 기반 인증에 대해서 살펴보자.
토큰 기반 인증
- 토큰: 서버에서 클라이언트를 구분하기 위한 유일한 값
- 서버가 토큰을 생성해서 클라이언트에 제공 -> 클라이언트가 이 토큰을 가지고 있다가 토큰과 함께 request를 보냄 -> 서버는 이 토큰만 보고 유효한 사용자인지 검증
토큰을 전달하고 인증받는 과정
- (클라이언트 -> 서버) 로그인 요청
- (서버 -> 클라이언트) 토큰 생성 후 응답
- (클라이언트) 토큰 저장
- (클라이언트 -> 서버) 토큰 정보와 함께 요청
- (서버) 토큰 검증
- (서버 -> 클라이언트) 응답
토큰 기반 인증의 특징
토큰 기반 인증은 무상태성, 확장성, 무결성의 특징을 가진다.
- 무상태성: 클라이언트의 인증 정보를 저장하거나 유지할 필요가 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": "안녕하세요!" //비공개 클레임
}
서명
- 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도
- 헤더의 인코딩 값과 내용의 인코딩 값을 합친 후에 주어진 비밀키를 사용해 해시값 생성
토큰 유효기간
- 토큰이 노출되었을 때를 대비하여 토큰에 유효기간 설정
리프레시 토큰
- 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급하기 위해 사용
- 액세스 토큰과 별개의 토큰
- 액세스 토큰의 유효 기간을 짧게 설정하고, 리프레시 토큰의 유효 기간을 길게 설정
- (클라이언트 -> 서버) 클라이언트가 서버에 인증 요청
- (서버 -> 클라이언트) 액세스 토큰 & 리프레시 토큰 응답
- (서버 -> 데이터베이스) 리프레시 토큰 저장
- (클라이언트 -> 서버) 요청
- (서버 -> 클라이언트) 토큰 유효성 검사 & 응답
- (클라이언트 -> 서버) 요청, 만료된 액세스 토큰 포함된 경우
- (서버 -> 클라이언트) 토큰 만료 응답
- (클라이언트 -> 서버) 액세스 토큰 발급 요청, 리프레시 토큰 포함
- (서버 -> 데이터베이스) 리프레시 토큰 조회 & 유효성 검사
- (서버 -> 클라이언트) 새로운 액세스 토큰 응답
참고자료
- 스프링 부트 3 백엔드 개발자 되기, 신선영, 골든래빗, 2023.05.12
'대딩코딩 > 웹개발 스터디' 카테고리의 다른 글
[Backend Development] AI Model Serving (0) | 2024.07.17 |
---|---|
[스프링 부트 3 백엔드 개발자 되기] Chapter 11. AWS에 프로젝트 배포하기 (0) | 2024.06.26 |
[스프링 부트 3 백엔드 개발자 되기] Chapter 7. 블로그 화면 구성하기 (2) | 2024.05.01 |
[스프링 부트 3 백엔드 개발자 되기] Chapter 6. 블로그 기획하고 API 만들기 (0) | 2024.04.07 |
[Express] 19. React Nodejs Start (1) | 2023.12.05 |