저번 포스트에서는 JWT을 생성해보는 것까지 해보았는데,
이제 이 토큰을 cookie에 담아서 respond 해보려고 한다.
var jwt = require('jsonwebtoken'); // 모듈 불러오기
var token = jwt.sign({ foo: 'bar' }, process.env.myKey); // 토큰 생성하기
// app.post('/login')
res.cookie("token" , token)
해당 코드대로 작성한 뒤, 서버를 작동시키고 Postman을 통해 request를 날려보면,
Postman의 respond로 Cookie 데이터를 받은 것을 확인할 수 있다.

참고로, respond 할 때에는, express의 내장 메소드res.cookie()로 쿠키를 설정할 수 있지만, 클라이언트가 쿠키를 가지고 request 할 때에는 cookie-parser라는 외부 모듈을 사용한다.
만약, 위 코드를 사용하는 상황이 로그인에 대한 쿠키를 전달해주는 것이라면,
올바르지 않은 로그인 요청값이 들어왔을 때에는 403 status code를 통하여 에러를 전달해준다.
토큰을 발행할 때, 추가적인 옵션인 HttpOnly 와 Secure 을 설정할 수 있다.
이 두 옵션은 모두 보안을 위해 사용된다.
HttpOnly : HttpOnly는 쿠키에 대한 접근을 스크립트를 통해서는 불가능하게 만드는 설정으로, XSS 공격으로부터 보호하는 역할을 한다. ( HTTP에서는 <script> 태그를 통해 자바스크립트를 사용할 수 있다.)
Secure : 쿠키가 암호화된 HTTP(=HTTPS)를 통해서만 전달되도록 함으로써, 마찬가지로 외부에서 쿠키를 변조 및 감청이 불가능하도록 보호하는 역할을 한다.
express를 통해 쿠키에 보안을 적용시키는 것은 간단하다.
쿠키를 보낼 때, 다음과 같이 작성하면 된다.
res.cookie('token', token, {
httpOnly: true,
secure: true
})
토큰을 한번 발행했다면, 해당 토큰을 이용할 수 있는 기간에 대해서도 명시를 해줘야 한다.
이렇게 하지 않으면, 공용PC에서 로그인을 했을 때 로그아웃을 누르지 않고 자리를 비웠을 때, 다른 사람들이 내 정보를 이용할 수 있기 때문이다.
따라서, JWT에 대해서 만료 시간을 설정해보자.
만료 시간을 지정해주는 것 또한 간단하다.
jsonwebtoken 모듈을 이용해서 token을 생성할 때, 옵션에 추가해주면 된다.
const token = jwt.sign(
{
email : loginUser.email,
name : loginUser.name
},
process.env.PRIVATE_KEY, // .env파일의 환경변수가 없다는 오류발생시, `{process.env.PRIVATE_KEY}` 입력
{
expiresIn : '30m' ,
issuer : "lee"
})
// jwt.sign(PAYLOAD , SECRET, OPTIONS)
expiresIn 옵션은, token을 얼마나 유지시켜줄 지에 대한 옵션이다. 30m은 30분을 의미한다.
issuer 옵션은, token을 누가 발행해주었는지에 대한 옵션이다.
이렇게 토큰을 발행한 뒤, 콘솔에 출력해보고 Encoded된 토큰을 JWT 공식페이지(jwt.io) 에 입력해보면, Payload값에 해당 만료시간과 발행자에 대한 정보가 나타나는 것을 확인할 수 있다.