
```json
{
"typ": "JWT",
"alg": "HS256"
}
```
즉, JWT 토큰으로 이루어져있고, 해싱 알고리즘으로 HS256을 사용했다는 것을 알 수 있음
- 토큰에 대한 정보를 담기 위한 클레임, 이미 이름이 등록되어있는 클레임
- iss: 토큰 발급자 (issuer)
- sub: 토큰 제목(subject)
- aud: 토큰 대상자(audience)
- exp: 토큰 만료시간(expiration), 시간은 date, 항상 현재 시간보다 이후
- nbf: Not before를 의미, 토큰의 활성 날짜와 비슷한 개념, NumericDate 형식으로 날짜 지정
- iat: 토큰 발급 시간 (isuued at)
- jti: jwt의 고유 식별자
{
"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) 클레임
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

- 사용자가 id, pw를 입력받아 서버에 로그인 인증을 요청
- 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의. 헤더, 페이, 서명을 각각 Base64로 한 번 더 암호화하여 JWT를 생성
- Access token과 refresh token을 클라이언트에게 전달
- 클라이언트는 서버로 부터 받은 JWT를 로컬 스토리지에 저장
- Authorization header에 Acess Token을 담아서 API를 서버에 요청
- 서버는 클라이언트가 Header에 담아 보낸 JWT가 서버에서 발급한 토큰인지 일치여부를 확인하고 일치한다면 인증을 통과시키고 아니면 거절
- 인증이 통과되면 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에게 돌려줌
- 만약 access token 시간이 만료했다면 refresh token을 이용해서 서버로부터 새로운 acess token을 발급받음
- Access Token: 클라이언트가 가지고 있으며 실제로 유저의 정보가 담긴 토큰, 클라이언트에서 요청이 오면 서버에서 해당 토큰에 있는 정보를 활용하여 사용자 정보에 맞게 응답을 진행
- Refresh Token: 새로운 Access Token을 발급하기 위해 사용하는 토큰, 짧은 수명을 가지는 Access Token에게 새로운 토큰을 발급해주기 위해 사용, 보통 db의 유저 정보와 같이 기록