일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Router
- node.js
- 개발자
- ngrinder
- 예제
- nodejs
- 자바
- Django
- Python
- 스크럼 마스터
- express
- Groovy
- 스크럼
- Stream
- C++
- 이벤트 루프
- 파헤쳐보자
- Knowledge Graph
- node
- 스레드
- RDF
- 노드
- benchmark
- 소켓
- 노드js
- java
- socket.io
- 특징
- 지식 그래프
- scrum
- Today
- Total
라봉이의 개발 블로그
express-session- cookie 외에 다른 방법으로 인증하는 법 본문
express-session- cookie 외에 다른 방법으로 인증하는 법
Labhong 2018. 8. 31. 19:33nodejs에서는 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를 배워서 하는 게 나을지도 모르겠다.
'Node.js > express' 카테고리의 다른 글
node.js express 6. express의 오류처리 (0) | 2019.04.05 |
---|---|
node.js express 5. middleware란? 미들웨어 정의, 미들웨어 유형 (4) | 2018.03.26 |
node.js express 4. route paths 라우트 경로, route parameters 라우트 파라미터, response methods 응답 메서드 (0) | 2018.03.14 |
node.js express 3. static file 정적 파일 옵션, path 모듈 (4) | 2018.03.04 |
node.js express 2. router 객체, res.render 렌더링 (0) | 2018.03.04 |