😮 jwt 토큰은 네트워크로 전송하기 때문에 공간을 적게 차지해야한다. 그래서 Json 으로 데이터를 저장할 때, Key를 3글자로 줄인다!
{
"alg": "HS256"
"typ": "JWT",
}
2. Payload
❗ 민감한 정보는 담지 않는다!
{
"sub": "(토큰 제목)",
"iss": "(발행인)"
"exp": "(유효 시간)"
"iat": "(토큰 발급 시간)"
Claim
- 사용자나 토큰에 대한 property를 key-value 형태로 저장한다.
- 토큰에서 사용할 정보의 조각들, Payload에 담길 데이터를 입력
표준 Claim
= 미리 정의된 클레임
- iss(issuer) : 토큰 발급자
- sub(subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값
- aud(audience) : 토큰 대상자
- exp(expiration time) : 토큰 만료 시간
- nbf(not before) : 토큰 활성 날짜(이 시각 이전의 토큰은 활성화되지 않음을 보장한다)
- iat(issued at) : 토큰 발급 시간
- jti(jwt id) : 토큰 식별자(issuer가 여러명 일 때 구분하기 위해 사용)
사용자 정의 Claim
- 충돌 방지를 위해 URI 포맷을 이용한다. [공개]
- 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다. [비공개]
{
"token_type" : "access token"
}
3. Signature
- 시그니처는 토큰이 유효한지 위조되었는지를 확인하기 위해 사용된다.
- 여기에는 서명이 저장되는데 암호화되어 있기 때문에 서버에 있는 개인 키로만 복호화가 가능하다.
- 헤더(Header) & 페이로드(Payload) 인코딩 (by BASE64)
- 인코딩한 값을 해싱 (by 비밀 키 + Header의 "alg" 알고리즘)
- 해싱한 값을 다시 인코딩 (by BASE64)
- Signature 완성!
signWith()
에는 서명 알고리즘과 비밀 키가 들어간다. 서명 알고리즘으로 HS256을 선택한다면 비밀 키는 별도의 클래스에서 관리한다. 비밀 키는 공개되어서는 안되기 때문에 깃 허브에 올릴 때는 해당 파일을 .gitignore에 추가하도록 하자.