NEST.JS에 JWT Token을 적용하기 위한 이론 알고 가기
JWT란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 말한다.Header, Payload, Signature 으로 점(.)으로 구분하는 구조이다.

header는 typ,alg 정보를 가지고 있다.
typ은 토큰의 타입을 지정하며, alg은 해싱 알고리즘을 지정한다.
해싱 알고리즘은 HMAC, SHA256, RSA등이 있으며 지정한 알고리즘은 토큰 검증 시 signature 부분에 사용 된다.

payload는 토큰에 담을 정보가 담겨 있다. key-value 형식으로 이루어진 정보를 클레임 셋 (Claim Set) 이라 부른다.
Claim에는 크게 세가지 registered Claim, public Claim, private Claim을 토큰에 담을 수 있다.
토큰에 대한 정보들을 담기 위한 클레임 셋이다. 아래 클레임 셋은 모두 Optional이다.
iss: 토큰 발급자(issuer)sub: 토큰 제목(subject)aud: 토큰 대상자(audience)exp: 토큰 만료시간(expiration)nbf: 토큰의 활성 날짜(Not Before)iat: 토큰이 발급된 시간(issued at)jti: 고유 식별자로서 중복적인 처리를 방지하기 위해 사용, 일회용 토큰에 사용하면 유용사용자 정의 클레임으로 공개용 정보를 위해 사용된다. 또한 충돌 방지를 위해 URI 형식으로 이용한다.
{
"https://velog.io/@hong-brother/name": "hong-brother"
}
클라이언트와 서버간에 합의하에 등록하여 사용 할 수 있는 클레임 이다.
{
"u": "ggbqmf113013e4c5",
"r": "fce10bab",
"t": "a",
"https://velog.io/@hong-brother/name": "hong-brother"
"iat": 1671118700,
"exp": 1671723500
}
RSASHA256( <-- header의 alg에 따라서 변경
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
signature는 인코딩된 header, payload에 "."을 더한 뒤 비밀키로 해싱하여 생성한다.
Header 및 Payload는 단순 인코딩된 값이기 때문에 해커가 복호화하고 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.
따라서 Signature는 토큰의 위변조 여부를 확인하는 데 사용된다.