https://velopert.com/2350 를 참고하였다.
토큰 기반 시스템은 stateless(무상태) 하다. 유저의 인증정보를 서버나 세션에 담아두지 않는다.
1. 유저 로그인
2. 서버측에서 해당 계정정보를 검증
3. 계정정보가 정확하면, 서버에서 유저에게 signed 토큰을 발급
(signed : 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature 를 지니고 있음)
4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달
5. 서버는 토큰을 검증하고, 요청에 응답
웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달!
header.payload.signature
{
"typ": "JWT",
"alg": "HS256"
}
{
"idx": 2,
"id": "jihye",
"age": 23,
"iss": "duksung",
"exp": "1590937199"
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
jwt.sign(json data, secretKey, [options, callback])
jwt.verify(token, secretKey, [options, callback])
JWT 모듈 설치
$ npm isntall jsonwebtoken rand-token
나는 클라이언트의 cookie에 저장해줄거다.
res 객체를 반환할 때 쿠키에 token 값을 담고 설정한다.
...
res.cookie('accessToken',token,{
expires: new Date(Date.now() + 604800000),
secure: false,
httpOnly: true,
});
...