개인 공부 용으로 오늘은 jwt에 대해 공부했다.
아래는 내가 jwt를 공부하면서 기존의 인증,인가 방식은 session과 비교해서 정리한 내용이므로 참고하길 바랍니당~
JWT 토큰
Session 인증
JWT 사용하기 이전에 서버와 클라이언트 사이에서 인증하기 위해 주로 사용되는 방식은 session이다. session 인증에 대한 간단한 설명은 아래와 같다.
![](https://velog.velcdn.com/images/iamdudumon/post/75fe6ae2-2385-4062-8aa9-6d374c548aca/image.png)
- 클라이언트에서 사용자의 인증 정보를 서버에 전달
- 서버는 인증을 처리한 뒤 해당 user에 대해 session을 생성
- session 정보는 서버에 저장되고, 클라이언트는 session id를 받아 브라우저에 저장
- 클라이언트는 이후 이루어지는 요청에 session id를 이용
- 서버는 전달 받은 session id를 이용하여 저장 중인 session 정보로 인증을 처리
- 만약 session id가 만료되었을 경우에는 1번 과정부터 다시 진행
Session 인증 방식은 session 정보를 서버 측에서 저장하고 관리
→ 클라이언트에서 서버로 매 요청마다 인증을 하기 위해서는 서버에서 DB나 메모리지 등 storage를 탐색하는 과정이 필요
→ 모든 요청에 인증을 처리하는 I/O overhead가 발생
<문제점>
http 방식의 장점 중 하나인 stateless를 위배
→ 서버가 session 정보를 저장하므로 session ID, 즉 클라이언트의 상태를 저장하는 상황이므로 stateful인 하게 됨
→ scale out에 걸림돌이
JWT란?
JWT(Json Web Token)은 웹에서 사용되는 json 형식의 토큰에 대한 표준 인증 방식이다. 주로 사용자의 인증(authentication)이나 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 통신하기 위해서 사용된다. 클라이언트가 서버로부터 인증을 받기 위한 필요한 정보들을 token에 담아 암호화시켜 사용한다.
→ Session 인증과 가장 큰 차별점은 토큰 자체에 유정의 정보를 포함, 서명된 토큰
JWT 구조
JWT는 아래의 그림과 같이 각각의 크게 3 세개의 영역(header, palyload, signature)이 존재하며 점(.)으로 각각의 구성 요소로 구분되어있다.
![](https://velog.velcdn.com/images/iamdudumon/post/16eafe43-958a-4cf7-9346-7378ba7d6d88/image.png)
- Header
- xxxxx
- JWT의 메타 정보를 나타냄
- 토큰의 타입이나, signing에 어떤 알고리즘을 사용되었는지 저장
헤더
{
"alg": "HS256",
"typ": "JWT"
}
→ 위의 Json 정보를 Base64Url 방식으로 인코딩
- Payload
- yyyyy
- Claim이라는 사용자에 대한 속성(정보)를 key-value 쌍 형태로 저장
- 토큰이 만료되는 시간, 사용자의 정보와 같은 실질적인 데이터를 담는 영역
- 개발자가 임의로 Claim 값을 넣을 수 있으나 JWT의 표준 스펙이 존재
- 표준 스펙 외에도 token에 필요한 정보를 추가해도 문제가 없지만 Ciaim 값을 정의할 때 가장 고려해야 할 점은 민감한 정보를 포함하지 않는 것!
- payload는 json 파싱돼있을 뿐이지 별도의 암호화 과정을 거치지 않기 때문에 토큰이 타사용자에게 탈취 당할 때 보안적 이슈가 발생할 가능성이 존재
- Signature
- zzzzz
- signing을 통해 토큰 안에 사용자 정보를 포함하면서 안전하게 처리
- Header에 포함된 값들과 Payload에 포함된 값들을 각각 decoding 한 두 값을 합쳐 서버가 가지고 있는 개인키로 암호화한 값이 저장
- 따라서 signatue에 저장된 정보는 서버가 소지한 개인키로만 복호화가 가능
- 토큰의 위조, 변조 문제를 해결 가능
→ JWT 인증은 서버에서 별도의 데이터베이스 탐색 없이도 빠르게 사용자 인증 과정 수행이 가능
JWT 인증 과정
JWT를 이용한 클라이언트-서버 구조에서 사용자 인증, 인가 과정을 아래와 그림, 설명과 같다.
![](https://velog.velcdn.com/images/iamdudumon/post/0eb00811-8d07-4ad8-b8fb-9445d82ba8fd/image.png)
- (session 인증과 마찬가지로) 클라이언트에서 사용자의 인증 정보를 서버에 전달
- 서버는 인증 정보로 인증을 처리하고 (session 대신) JWT를 생성하여 클라이언트에 전달
- 클라이언트는 JWT를 브라우저에 저장
- 클라이언트는 이후 이루어지는 요청에 JWT를 이용
- 서버는 JWT를 검증하여 인증을 처리
- JWT가 만료되면 토큰을 refresh (재발급)
Reference
JWT 제대로 알고 사용하기(w/ Django)
JWT(Json Web Token) 알아가기