Jason Web Token
Json 포맷을 이용하여 사용자에 대한 속성을 전달하는 Claim 기반 Web Token
토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달
JWT구조
Header, Payload, Signature 3부분으로 구성
Json 형태인 각 부분은 Base64Url로 인코딩
각 부분을 이어주기 위해 , 구분자 사용
Header
alg
Signature를 해싱하기 위한 알고리즘을 지정
typ
토큰의 타입을 지정
ex) JWT
{
"alg": "HS256",
"typ": JWT
}
Payload
토큰에 담을 정보
하나의 정보 조각을 클레임(Claim) 이라고 부르고 이는 name, value 한 쌍으로 이루어 짐
클레임의 종류는 크게 3개로 구분
register : 등록된 클레임
서비스에 필요한 정보들이 아닌, 토큰에 대한 정보를 담기 위해 이름이 이미 정해진 클레임
등록된 클레임은 모두 선택적 (Optional)
- iss : 토큰 발급자 (Issuser)
- sub : 토큰 제목 (subject)
- aud : 토큰 대상자 (audience)
- exp : 토큰 만료 시간 (expiration)
- nbf : (not before) 토큰의 활성 날짜와 비슷한 개념, 이 날짜가 지나기 전까진 토큰 처리 X
- iat : 토큰이 발급된 시간 (issued), 이 값을 활용하여 토큰의 age가 얼마나 되었는지 판단 가능
- jti : JWT의 고유 식별자, 주로 중복적인 처리 방지를 위해 사용, 일회용 토큰에 사용 시 유용
public : 공개된 클레임
공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 함
충돌 방지를 위한 URI 형식의 이름
{
"https://rainover0824.tistory.com//jwt_claims/is_admin": true
}
private : 비공개 클레임
서버와 클라이언트 협의 하에 사용되는 클레임 이름
공개 클레임과는 달리 이름이 중복되어 충돌 가능성 존재
{
"username": "rainover"
}
Payload 예시
{
"iss": "tistory.com",
"exp": "1485270000000",
"https://rainover0824.tistory.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "rainover"
}
Signature (서명)
헤더의 인코딩 값, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬하여 생성
** 서명 부분을 만드는 슈도 코드의 구조
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
문자열을 Base64 형태로 표현
JWT 예시
앞서 설명한 Header, Payload, Signature 을 합치면
이런 JWT 생성!
'끄적 > BE' 카테고리의 다른 글
Persistence Context (영속성 컨텍스트) (0) | 2023.01.01 |
---|---|
Spring MVC (0) | 2022.12.29 |
JPA, Spring Data Jpa (0) | 2022.12.28 |
JPA (0) | 2022.12.28 |
Token을 사용한 로그인 인증 (0) | 2022.12.28 |