본문 바로가기

Node.js

[Node.js 10강] 암호화된 cookie를 이용한 로그인/로그아웃 처리

이번에는 node.js에서 cookie를 사용하는 방법을 알아보도록 하겠습니다. 

cookie를 그냥 사용하면 보안에 취약하므로 암호화된 cookie를 사용하는 방법으로 알아보겠습니다. 

 

Cookie 사용을 위한 설정

Cookie-parser 모듈 설치

Express 프레임워크은 cookie-parser라는 모듈을 통해 cookie를 사용합니다. 

npm install cookie-parser --save

 

 

web.js 설정

express 프레임워크에서 cookie parser를 사용할 수 있도록 web.js에 설정합니다. 

cookieParser(secret, options) 에서 첫번째 인자인 secret은 쿠키 서명에 사용되는 문자열 또는 배열을 의미(선택사항)하고, 두번째 인자 options는 쿠키에서 사용되는 option을 의미하며 선택사항입니다.  

var cookieParser = require('cookie-parser');

//암호화된 쿠키를 사용하기 위해 임의의 문자 사용
app.use(cookieParser('fvnslfjslkfjslfjslf'));

//평문 쿠키를 사용하려는 경우
//app.use(cookieParser());

 

 

Cookie 사용하기

cookie에 값 세팅

res.cookie(name, value, options) 함수를 통해 응답 헤더에 쿠키를 설정합니다.

router.get('/login', function (req, res) {
	... 
	var expiryDate = new Date( Date.now() + 60 * 60 * 1000 * 24 * 7); // 24 hour 7일

	res.cookie('loginObj', loginObj, { expires: expiryDate, httpOnly: true, signed:true });
    ...
}    

자주 사용하는 Options

expires 는 전송된 쿠키의 보증기간을 의미합니다. (임의로 쿠키를 삭제하지 않는 한 브라우저를 종료하더라도 보증기간까지 사라지지 않음)

httpOnly 는 웹서버에서만 쿠키에 접근할 수 있도록 플래그를 지정합니다. (자바스크립트에서 임의로 cookie에 접속하는 것을 막기 위해 true로 설정)

signed : 서명(암호화)된 쿠키를 사용하도록 설정합니다.

 

cookie 값 사용

암호화된 쿠키의 경우는 'req.signedCookies.변수명'을 이용해서 사용하면 됩니다. 

일반 쿠키의 경우는 'req.cookies.변수명'으로 사용합니다. 

router.get('/login', function (req, res) {
  ...
  var cookieLoginObj = req.signedCookies.loginObj; //암호화된 쿠키
  
  var cookieLoginObj = req.cookies.testKey;	//평문 쿠키
  ...
});

 

 

 

로그인 처리

이전에 알아본 네이버밴드 로그인 API를 이용해서 정상적으로 로그인한 경우 암호화된 쿠키를 저장해서 로그인 처리 합니다.  (반드시 암호화된 쿠키 사용해야하며, 비밀번호 등 민감한 개인정보를 저장하면 안됨)

2019/04/02 - [Node.js] - [Node.js] 외부서비스 API(네이버밴드) 적용하기

 

router.get('/login', function (req, res) {
	... 
	var expiryDate = new Date( Date.now() + 60 * 60 * 1000 * 24 * 7); // 24 hour 7일

	res.cookie('loginObj', loginObj, { expires: expiryDate, httpOnly: true, signed:true });
    ...
}    

 

그리고 로그인 여부를 아래와 같이 체크합니다. 

router.get('/', function(req, res) {

  var cookieLoginObj = req.signedCookies.loginObj;
  
  if(cookieLoginObj && cookieLoginObj.mberSn !== ''){
    ..로그인한 경우 처리..
  }else{
  	..로그인하지 않은 경우 처리..
  }
});

 

 

로그아웃 처리

res.clearCookie(쿠키명)을 이용합니다. 

router.get('/logout', function (req, res) {
	res.clearCookie("loginObj");	
	res.redirect("/");
});

 

 

https://github.com/expressjs/cookie-parser

 

expressjs/cookie-parser

Parse HTTP request cookies. Contribute to expressjs/cookie-parser development by creating an account on GitHub.

github.com

 

다음강좌 : 

2019/04/03 - [Node.js] - [Node.js 11강] 모든(또는 특정)요청에 대한 공통로직을 처리하기 위해express next() 사용하기