jwt란? - https://rekodo.tistory.com/63
jwt (json wep token)
JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs
rekodo.tistory.com
jwt 구조
1. 헤더
- typ : 토큰의 타입을 지정합니다. JWT라는 문자열이 들어가게 됩니다.
- alg: 해상 알고리즘을 지정합니다.
{
"typ": "JWT",
"alg": "HS256"
}
위 예제를 해석하면, JWT 토큰으로 이루어져있고, 해당 토큰은 HS256으로 해상 알고리즘으로 사용되었다는 것을 알 수 있습니다.
3-2. 정보(payload)
토큰에 담을 정보가 들어갑니다. 정보의 한 덩어리를 클레임(claim)이라고 부르며, 클레임은 key-value의 한 쌍으로 이루어져있습니다. 클레임의 종류는 세 종류로 나눌 수 있습니다.
- 등록된(registered) 클레임
- 토큰에 대한 정보를 담기 위한 클레임들이며, 이미 이름이 등록되어있는 클레임
- iss : 토큰 발급자(issuer)
- sub : 토큰 제목(subject)
- aud : 토큰 대상자(audience)
- exp : 토큰의 만료시간(expiraton). 시간은 NumericDate 형식으로 되어있어야 하며,(예: 1480849147370) 항상 현재 시간보다 이후로 설정되어있어야한다.
- nbf : Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념. NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않는다.
- iat : 토큰이 발급된 시간 (issued at)
- jti : JWT의 고유 식별자로서, 주로 일회용 토큰에 사용한다.
- 공개(public) 클레임
- 말 그대로 공개된 클레임, 충돌을 방지할 수 있는 이름을 가져야하며, 보통 클레임 이름을 URI로 짓는다.
- 비공개(private) 클레임
- 클라이언트 - 서버간에 통신을 위해 사용되는 클레임
→ 예제 Payload
{
"iss": "ajufresh@gmail.com", // 등록된(registered) 클레임
"iat": 1622370878, // 등록된(registered) 클레임
"exp": 1622372678, // 등록된(registered) 클레임
"https://shinsunyoung.com/jwt_claims/is_admin": true, // 공개(public) 클레임
"email": "ajufresh@gmail.com", // 비공개(private) 클레임
"hello": "안녕하세요!" // 비공개(private) 클레임
}
3-3. 서명(signature)
해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도로 사용하며, 헤더(header)의 인코딩 값과 정보(payload)의 인코딩값을 합친 후에 주어진 비밀키를 통해 해쉬값을 생성합니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
이제 JWT의 구조까지 알아보았으니, (드디어) 본격적으로 Spring 환경에서 JWT를 다루기 위해 사용하는 jsonwebtoken 사용법에 대해 알아보도록 하겠습니다.
구현
1. 의존성 추가
jsonwebtoken을 사용하기 위해 의존성을 추가해줍니다.
implementation 'io.jsonwebtoken:jjwt:0.9.1'
'develop > Backend -Java' 카테고리의 다른 글
비동기 처리를 위한 Webflux (with. FCM) (0) | 2023.12.09 |
---|---|
[spring] 에러 코드 관리 (0) | 2022.11.25 |
jwt (json wep token) (0) | 2022.11.20 |
Java(eclips)에서 DB(postgresql) 서버로 - JDBC (0) | 2022.04.04 |