라봉이의 개발 블로그

express-session- cookie 외에 다른 방법으로 인증하는 법 본문

Node.js/express

express-session- cookie 외에 다른 방법으로 인증하는 법

Labhong 2018. 8. 31. 19:33
반응형

nodejs에서는 express-session이란 모듈을 통해 사용자 인증을 구현하는 방법이 존재한다.


이 express-session은 쿠키를 통해 sessionID를 클라이언트에게 전달하고, 클라이언트가 cookie를 통해 서버에 요청시 쿠키의 sessionID를 키 값으로 이용, session store에 있는 세션 객체를 가지고와서 사용자의 중요한 정보를 가지고 온다.


필자가 express-session으로 구현해 놓은 서버(사이드 프로젝트용)에 급하게 sessionID를 쿠키 대신 http header에 전달하게 되었기 때문에 로그인 시에 response.body에 sessionID를 전달해야 했다.

그 방법을 급하게 알아본 결과 그런 방법은 존재하지 않았다...


하지만 이에 굴하지 않고 방법을 찾아보았다.


express-session은 express가 클라이언트에게 응답하기 전에 응답 header에 set-cookie를 설정하여 클라이언트의 쿠키를 저장하도록 만든다.

이때 session의 id가 암호화되서 저장된다. 암호 키는 물론 session 설정시 secret에 있는 문자열이다.


그러나 req.session이나 header에 존재하는 set-cookie를 통해 암호화된 sessionID를 가지고 올 수 없다.

보내기 직전에 sessionID를 암호화를 시키기 때문에 그렇다.


express-session을 직접 뜯어본 결과 sessionID를 암호화하는 코드를 발견했다.

function setcookie(res, name, val, secret, options) {
  // sessionID 암호화
  var signed = 's:' + signature.sign(val, secret);  // signature는 require('cookie-signature');
  var data = cookie.serialize(name, signed, options); 

  debug('set-cookie %s', data);
  var prev = res.getHeader('set-cookie') || [];   var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
  res.setHeader('set-cookie', header)   // 암호화된 sessionID를 set-cookie 헤더를 통해 클라이언트에게 전달, 클라이언트는 sessionID를 쿠키에 저장한다. }


그래서 내 코드에 그냥 sessionID 암호화 하는 부분을 가지고 와서 로그인 시에 response.body에 전달해버렸고 클라이언트가 이 sessionID를 받아서 나중에 요청할 때 토큰 인증 방식처럼 헤더에 전달하도록 했다.


그리고 app.js에 app.use(session({ ... }))을 사용하기 전에 미들웨어를 하나 등록해뒀다.

tokenHeaderToCookie.js 파일
module.exports = function (req, res, next) {
    if(req.headers[TOKEN_NAME]) {
        debugger;
        if(!req.cookies) {
            req.cookies = {};
        }
        req.cookies[TOKEN_NAME] = req.headers[TOKEN_NAME];
        next();
     } else {
        next();
    }
};


app.js 파일 

... app.use(require('./app/helpers/middleware/tokenHeaderToCookie')); app.use(require('./app/helpers/sessionHandler'););      // 세션 설정해둔 모듈 ... 


그렇게 했더니 임시로 구동이 되었다.


이렇게 임시로 때웠지만 차라리 jwt를 배워서 하는 게 나을지도 모르겠다.



반응형
Comments