✅ express-session 란?
현대의 웹페이지는 HTTP 프로토콜로 이루어져 있고, HTTP 특성상 비연결성(Connectionless)과 비상태성(Stateless) 특성 때문에 사용자와의 연결이 유지되지 않고, 연결 해제 후에도 상태 정보를 저장하지 않는다.
서버의 자원 절약이라는 측면도 있지만, 사용자 식별이 불가하기 때문에 매번 새로운 사용자로 인식한다는 점이 불편하다.
그런 점을 보완하고자, 쿠키(Cookie) 및 세션(Session) 인증 방식을 통해 클라이언트 상태 정보를 지속적으로 가져와 그에 알맞는 정보 및 화면을 제공하는 것이다.
📝 작동 방식
- 클라이언트가 서버에 처음으로 접근하여 요청(Request)을 보내면 서버는 접근 클라이언트의 Request-Header 필드인 cookie 값이 있는지 확인 후 없으면 새로 발급 후 저장
- 요청마다 클라이언트는 전달받은 session id 값을 헤더 쿠키에 넣어서 서버에 전달하고 서버는 이를 이용해 사용자를 식별한다.
- 클라이언트는 재접속시, 이 쿠키를 이용하여 session id 값을 서버에 전달한다.
📝 기본 방식
먼저 기본적으로 express 기본 설정하고 난 뒤 express 프레임워크에서 세션을 관리하기 위한 미들웨어를 설정한다.
공식문서: https://www.npmjs.com/package/express-session
$ npm install express-session
express-session 예시
const express = require('express');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const FileStore = require('session-file-store')(session);
const app = express();
app.use(cookieParser());
//세션 추가
app.use(session({
secure: true, //https 환경에서만 session 정보 교환 가능
secret: ' ', //세션 암호화(자신이 원하는 키 이름 아무거나 설정)
resave: false, //세션을 항상 저장할 지
saveUninitialized: true, //초기화 되지 않은채로 스토어에 저장
cookie: { //세션 쿠키 설정 (세션 관리 시 클라이언트에게 보내는 쿠키)
httpOnly: true, //자바스크립트를 통해 세션 쿠키를 사용할 수 없도록 함
secure: true
},
name: 'session-cookie', // 세션 쿠키명 디폴트 값은 connext.sid이지만 다른 이름 변경가능
store: new FileStore({
checkPeriod: 86400000, //24 hours(24 * 60 * 60 * 1000ms)
}), //데이터 저장 형식
cookie: { maxAge: 86400000 },
}));
app.get('/', (req, res, next) => {
//세션에 데이터를 설정하면, 모든 세션 설정되는게 아님, 요청 받은 고유의 세션 사용자의 값만 설정
req.session.id = "hiSession";
}
👉 세션은 사용자별로 req.session 객체 안에 저장된다.
최근에 웹페이지 회원가입과 로그인 기능 구현을 작업하는데 이걸로 작업을 하고 있다. 로그인 기능과 마이페이지 연결에선 필수적으로 필요한 것 같다.
session 불러오기
app.get('/', (req, res, next) => {
if(!req.session.num) { // 세션이 없을 시
req.session.num = 1; //세션 생성
}else {
req.session.num += 1;
}
res.send(`${req.session.num} 번 `);
});
app.listen(8080, () => {
console.log('8080 포트에서 대기중 입니다.');
});
- 한 루트 path로 접속을 할 때마다 req.session.num 1씩 증가
- 설정 후 처음 서버를 가동하면 sessions 폴더가 생성 폴더아레 디렉토리 세션 파일이 아래와 같이 생긴다
👉 'session-cookie'명으로 된 세션 쿠키가 설정된 것을 알 수 있다.(default 세션 쿠키 이름: 'connect.sid')
session 삭제
세션 객체를 삭제하기 위해서는 req.session.destroy를 이용한다.(ex. 로그아웃)
req.session.destroy( err => {
if (err) throw err;
res.redirect(302, '/'); //웹페이지 강제 이동
}
리다이렉션을 하면 바로 결과가 반영되지 않는 것을 감안하여 req.session.save(funcion() {}); 을 아래와 같이 사용한다.
app.post('/login', (req, res) => {
const userid = req.body.userid;
const userpass = req.body.userpass;
if(userid && userpass) { // id와 pw가 입력되었는지 확인
let sql = 'SELECT * FROM member WHERE userid = ? AND userpass = ?';
connection.query(sql, [userid, userpass], (err, results, fields) => {
if(err) throw err;
if(results.length > 0) { // db에서의 반환값이 있으면 로그인 성공
req.session.is_logined = true;
req.session.nickname = userid;
req.session.save(function() {
res.redirect('/');
});
} else {
res.send('<script type="text/javascript">alert("로그인 정보가 일치하지 않습니다."); document.location.href="/login";</script>');
}
📝 Session Store
세션은 서버 메모리(MemortStore)에 저장된다. (쿠키: 개인 PC에 저장), Session Store의 종류로는 Memory Store, File Store, Mongo Store이 있다고 한다. (최근 프로젝트인 웹페이지를 만들 때 File Store 을 이용했다.)
Default 저장 장소는 Memory Store이다 서버나 클라이언트는 껏다 키면 사라지는 휘발성이므로 고유 저장소가 필요하다.
👉 상단 express-session 예시 참고