jwt는 json web token의 약자로 웹에서 인증을 처리할 때 사용하는 토큰이다.(주로 로그인 처리할 때 많이 사용한다..) jwt는 header , payload , signature로 구성되어 서버에서 사용자에게 응답해 준다.

1.payload(내용)
페이로드에는 요청응답받을 내용이 적혀있다. 예를 들어 사용자의 정보, 접근권한, 토큰만료시간 등이 적혀있다
2.signature(서명)
서명을 통해 payload, header가 위조되었는지 확인을 하게 된다
페이로드와 서버에 있는 시크릿 키를 가지고 서명 알고리즘을 거치면 그게 signature서명이 된다
보통 hmac방식의 서명 알고리즘을 통해 암호화되어 signature이 된다
3.header(헤더)
헤더에는 어떤 암호화 기술을 사용해서 서명을 만들었는지 적혀있다
jwt의 방식은 서버에서 클라이언트로부터 요청 온 토큰만 보고 판단하고 있기 때문에 Stateless라고 한다
(토큰만 보면 되니까 사용자의 상태를 저장하지 않음)
4.jwt처리과정(구현방법)
1. 사용자가 로그인을 하면 db에서 검증을 하고 난 뒤에 맞으면 jwt토큰을 만들기 시작한다
2. 페이로드를 만들며 아래와 같은 정보가 적힌다
sub — 토큰의 주체(보통 userid)
iat — 토큰 발급 시각
exp — 만료시간
iss — 발급자(issuer)
aud — 토큰 대상자(audience)
페이로드는 외부에서 노출되는 정보로 암호화가 아니라 단순인코딩 되는 정보 이기 때문에 주민번호, 비밀번호, 카드번호 등 민감한 개인정보는 절대 넣으면 안 된다
3.jwt처리 과정에서 사용할 시크릿키를 지정해 주고 시크릿키와 payload를 암호화 알고리즘을 통해 암호화한다
보통 hmac의 HS256 방식을 많이 사용하여 암호화하는 것 같고 nestjs기반에서는 아래의 라이브러리를 사용하여 구현하면 된다
https://www.npmjs.com/package/@nestjs/jwt
4.header에는 해당 토큰이 어떤 방식으로 만들어졌는지가 적혀있다.(토큰 타입과 암호화할 때 사용한 서명알고리즘 작성됨)
{
"alg": "HS256",
"typ": "JWT"
}
5. 1~4 방법이 지나면 header, payload, signature이 만들어진다. 이를 base64로 인코딩하여.으로 연결해 준다

6. 각각 인코딩 된거를 한줄로 이어붙여 .으로 구분된뒤에 client로 응답을 보낸다.client는 인코딩된 토큰을 로컬스토리지나 쿠키에 저장하게 된다.
-여기까지가 서버에서 클라이언트(브라우저)로 jwt를 처리하는 과정이다
5.client에서 server로 jwt 인증과정
client에서 server로 jwt를 보낸 다음 서버에서는 이를 디코딩하여 원본값을 보게 된다
이때 여기서 보안적인 검증을 하게 되는데 헤더의 적힌 서명알고리즘을 통해 페이로드와 시크릿키를 다시 signature서명을 만듭니다.그리고 client로부터 온 signature과 일치하는지 확인을 합니다. 만약 틀리다면 페이로드가 위조되었다는 것으로 인증처리가 거부됩니다. 동일하다면 인증이 됨.
6. 마무리
jwt는 브라우저의 로컬스토리지, 쿠키에 저장되는데 이는 탈취당할 위험이 있긴 합니다
그래서 payload에 만료시간이 지정되어 있어 일정시간이 지나면 재발급되는데 이를 액세스토큰, 리프레쉬토큰으로 구분하여 처리합니다.아래 사이트를 들어가면 jwt를 만드는걸 체험할 수 있습니다
JSON Web Tokens - jwt.io
JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).
www.jwt.io