23. cookie에 보안 적용하기, JWT 만료 시간 지정하기

JSLEE·2024년 5월 15일

저번 포스트에서는 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를 통하여 에러를 전달해준다.


토큰을 발행할 때, 추가적인 옵션인 HttpOnlySecure 을 설정할 수 있다.
이 두 옵션은 모두 보안을 위해 사용된다.

HttpOnly : HttpOnly는 쿠키에 대한 접근을 스크립트를 통해서는 불가능하게 만드는 설정으로, XSS 공격으로부터 보호하는 역할을 한다. ( HTTP에서는 <script> 태그를 통해 자바스크립트를 사용할 수 있다.)

Secure : 쿠키가 암호화된 HTTP(=HTTPS)를 통해서만 전달되도록 함으로써, 마찬가지로 외부에서 쿠키를 변조 및 감청이 불가능하도록 보호하는 역할을 한다.

express를 통해 쿠키에 보안을 적용시키는 것은 간단하다.
쿠키를 보낼 때, 다음과 같이 작성하면 된다.

  res.cookie('token', token, {
    httpOnly: true,
    secure: true
  })

JWT의 만료 시간 설정하기

토큰을 한번 발행했다면, 해당 토큰을 이용할 수 있는 기간에 대해서도 명시를 해줘야 한다.
이렇게 하지 않으면, 공용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값에 해당 만료시간과 발행자에 대한 정보가 나타나는 것을 확인할 수 있다.

profile
공부한 내용들을 정리하기 위해 사용하는 블로그입니다.

0개의 댓글