반응형

이 포스트는 데어 프로그래밍님의 유튜브 강의를 듣고 나서 정리한 글입니다.
JWT란?

jwt.io에 가보면 JWT를 이렇게 설명합니다.
- JWT로 주고받는 정보는 디지털 서명이 되어있으므로 확인하고 신뢰할 수 있다.
- JWT는 HMAC SHA256 (HS256) 알고리즘을 사용한다.
- JWT는 정보를 암호화하여 주고받을 수 있지만, 서명된 토큰에 중점을 둘 것. ("이건 내가 보낸게 맞아!" 라는 서명, 인증에 중점을 두었다.)
JWT 구조

(.)을 기준으로 세가지 부분으로 나뉜다.
- Header
- Payload
- Signature
완성된 토큰은 이렇다.
xxxxx.yyyyy.zzzzz
Header
{
"alg": "HS256",
"typ": "JWT"
}
- 어떤 알고리즘으로 암호화를 했는지
- 토큰의 타입이 무엇인지
Payload
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- Payload에는 클레임을 포함하고 있습니다.
- 등록된 클레임
- iss(발급자)
- exp(만료시간)
- sub(제목)
- aud(대상)
- 등등..
- 공개 클레임
- 내가 원하는 값들을 Key : value 형식으로 넣으면 된다.
- 비공개 클레임
- 당사자 간에 정보를 공유하기 위해 생성된 맞춤 클레임
Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Signature에는 Base64Url로 인코딩 된 header, payload, 시크릿 키를 가지고 HMAC256 알고리즘으로 암호화를 한 것입니다.
클라이언트 - 서버 간 JWT 토큰 생성

JWT 어떻게 검증할까?

이전에 Signature는 Header와 Payload와 시크릿 키로 HS256 암호화 알고리즘으로 생성한다고 했습니다.
- header
- payload
- secret_key
아래의 과정을 거쳐 토큰을 검증할 수 있습니다.
- 클라이언트에서 넘겨준 요청헤더에 JWT을 header, payload, signature 세가지로 분류한다.
- header와 payload를 base64UrlEncode한다.
- secret_key를 가지고 HMAC256 암호화를 하면? signature가 생성된다.
- 이제 방금 생성한 Signature와 클라이언트가 준 signature를 비교해본다.
이전 시간에 배웠던 Session을 사용했을 때보다 가장 큰 장점은 서버마다 세션 저장소니 스티키 세션이니 뭐니 하는 짓을 안해도 된다는 것입니다.
왜?
모든 서버들이 JWT를 검증하기 위해 {secret_key} 만 알고있으면 해당 서버에서 인증까지 마칠 수 있기 때문이다!
감사합니다.
반응형
반응형

이 포스트는 데어 프로그래밍님의 유튜브 강의를 듣고 나서 정리한 글입니다.
JWT란?

jwt.io에 가보면 JWT를 이렇게 설명합니다.
- JWT로 주고받는 정보는 디지털 서명이 되어있으므로 확인하고 신뢰할 수 있다.
- JWT는 HMAC SHA256 (HS256) 알고리즘을 사용한다.
- JWT는 정보를 암호화하여 주고받을 수 있지만, 서명된 토큰에 중점을 둘 것. ("이건 내가 보낸게 맞아!" 라는 서명, 인증에 중점을 두었다.)
JWT 구조

(.)을 기준으로 세가지 부분으로 나뉜다.
- Header
- Payload
- Signature
완성된 토큰은 이렇다.
xxxxx.yyyyy.zzzzz
Header
{
"alg": "HS256",
"typ": "JWT"
}
- 어떤 알고리즘으로 암호화를 했는지
- 토큰의 타입이 무엇인지
Payload
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- Payload에는 클레임을 포함하고 있습니다.
- 등록된 클레임
- iss(발급자)
- exp(만료시간)
- sub(제목)
- aud(대상)
- 등등..
- 공개 클레임
- 내가 원하는 값들을 Key : value 형식으로 넣으면 된다.
- 비공개 클레임
- 당사자 간에 정보를 공유하기 위해 생성된 맞춤 클레임
Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Signature에는 Base64Url로 인코딩 된 header, payload, 시크릿 키를 가지고 HMAC256 알고리즘으로 암호화를 한 것입니다.
클라이언트 - 서버 간 JWT 토큰 생성

JWT 어떻게 검증할까?

이전에 Signature는 Header와 Payload와 시크릿 키로 HS256 암호화 알고리즘으로 생성한다고 했습니다.
- header
- payload
- secret_key
아래의 과정을 거쳐 토큰을 검증할 수 있습니다.
- 클라이언트에서 넘겨준 요청헤더에 JWT을 header, payload, signature 세가지로 분류한다.
- header와 payload를 base64UrlEncode한다.
- secret_key를 가지고 HMAC256 암호화를 하면? signature가 생성된다.
- 이제 방금 생성한 Signature와 클라이언트가 준 signature를 비교해본다.
이전 시간에 배웠던 Session을 사용했을 때보다 가장 큰 장점은 서버마다 세션 저장소니 스티키 세션이니 뭐니 하는 짓을 안해도 된다는 것입니다.
왜?
모든 서버들이 JWT를 검증하기 위해 {secret_key} 만 알고있으면 해당 서버에서 인증까지 마칠 수 있기 때문이다!
감사합니다.
반응형