JWT(Json Web Token)
Json 포멧을 이용하여 사용자 정보를 담아 비밀리에 정보 전달 및 인증할 때 주로 사용하는 Claim기반의 Web Token이다.
Json 형식으로 주고 받기 위해 표준 규약에 의해 암호와 되어 복잡한? String 형태로 이루어져 있다.
JWT 구성요소
JWT는 Header(헤더), Payload(페이로드), Signature(서명) 으로 이루어져 있으며, Json 형태로 각 부분이 Base64로 encoding되어 표현된다.
1. Header(헤더)
토큰의 헤더는 alg, typ로 이루어 진다.
- alg: 알고리즘 형식을 지정하며, 서명 및 토큰의 증에 사용 ex)HS256
- typ: 토큰의 타입을 지정 ex)JWT
2. Payload(페이로드)
토큰에서 사용할 정보들인 Claim들이 담겨져 있다.
클레임은 총3가지로 Json 형태의 key: value 형태로 값을 넣을 수 있다.
- 등록된 클레임(Register Claim)
등록된 클레임은 토큰의 정보를 표현하기 위해 이미 정해진 종류의 데이터, 모두 선택적으로 작성이 가능하며 사용할 것을 권장한다. 또한 JWT에서 사용을 간견하기 위해 key의 길이를 3으로 지정해놓았다.
- iss: 토큰 발급(issuer) → 개발자 email을 넣는 편
- sub: 토큰 제목(subject) → unique한 값을 넣어야 해서 사용자의 email을 넣는 편
- aud: 토큰 대상자(audience)
- exp: 토큰 만료 기간(expiration), NumericDate 형식으로 되어 있어야 함
- nbf: 토큰 활성 날짜(not before), 이 날이 지나기 전의 토큰은 활성화 되지 않음.
- iat: 토큰 발급 시간(issued at), 토큰 발급 이후 시간의 경과를 알 수 있음.
- jti: JWT 토큰 식별자(JWT Id), 중복 방지를 위해 사용. 일회용 토큰(Access Token)에 사용하면 유용함
- 공개 클레임(Public Claim)
공개 클레임들은 충돌 방지를 위해서 URL 포멧을 이용하며 공개용 정보를 위해 사용됩니다.
{
"https://taeyang1234098.tistory.com": true
}
- 비공개 클레임(Private Claim)
등록된 클레임도 아니고, 공개된 클레임도 아님 사용자 정의 클레임으로, 서버와 클라이언트 사이에 임이로 정해놓은 정보를 저장한다. :)
{
"How_do_you_feel_today?": happy
}
3. Signature(서명)
토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 암호화 코드, 헤더와 페이로드의 값을 인코딩하고, 그 값을 시크릿 키를 사용해 헤더에서 정의한 알고리즘으로 해싱을 하여 이 값을 다시 인코딩하여 생성한다.
이렇게 생성된 JWT Token은 HTTP 통신을 할때 Header에 Authrization 담겨져, 앞에 Bearer 토큰임을 명시한 후 값을 넣어 사용한다.
headers: {
Authorization: `Bearer ${token}`,
},
JWT 링크: https://jwt.io/
'spring_boot > security' 카테고리의 다른 글
Spring Security와 동작 대해서 알아보자~ (0) | 2024.04.09 |
---|---|
Access Token과 Refresh Token이 필요한 이유 (0) | 2024.04.08 |