[Server] node.js 자동 로그인 구현 (Cookie + Session 활용)
개요
Cookie(쿠키)와 Session(세션)을 통해 자동로그인 로직을 구현해본다.
목차
소개
1. app.js 설정
app.js 설정
Client가 로그인 요청을 하면 Server는 요청한 Client와의 Session을 열어준다.
app.js
this.app.use(cookieParser()); //Cookie 값을 읽기 위한 setting
this.app.use( //session을 저장하기 위한 setting
session({
secret: process.env.SESSEONKEY,
resave: false, //request 마다 session값이 변경이 없으면 resave 하지 않음.
saveUninitialized: true, //초기화 되지 않은 session의 강제 저장 여부
cookie: { secure: false, maxAge: 24 * 60 * 60 * 30 }, //보안: false, maxAge: 30일
}),
);
2. 자동 로그인 시 Cookie값 설정 및 Session값 설정
Cookie 설정
let date = new Date();
date = date.toISOString().slice(0, 10);
res.cookie('omg_last_login', date, { //'omg_last_login'을 이름으로 하는 cookie 생성
expires: new Date(Date.now() + 24 * 60 * 60), //유효기간: 1일
httpOnly: true,
});
로그인 요청 (POST)
router.post('/login', function (req, res) {
if (!req.body.keepLogIn) { //자동 로그인이 아니라면 session과 cookie 생성
passport.authenticate('local-login', (err, user, message) => {
if (!user) res.send(message);
return req.login(user, loginError => {
if (loginError) next(loginError);
else {
let date = new Date();
date = date.toISOString().slice(0, 10);
res.cookie('omg_last_login', date, {
expires: new Date(Date.now() + 24 * 60 * 60),
httpOnly: true,
});
res.send(baseResponse.SUCCESS);
}
});
})(req, res, next);
} else { //자동 로그인 시 session값만 생성
passport.authenticate('local-login', (err, user, message) => {
if (!user) res.send(message);
return req.login(user, loginError => {
if (loginError) next(loginError);
else res.send(baseResponse.SUCCESS);
});
})(req, res, next);
}
}
3. 구현 Logic
로그인 요청 (GET)
자동 로그인 요청시 | 일반 로그인 요청시 |
세션 값 생성 (유효기간 30일) | 세션 값 생성 (유효기간 30일) + 쿠키 생성 (유효기간 1일) |
↓
로그인 페이지로 이동 | ||
'omg_last_login' 쿠키 값 존재 여부 확인 및 session 값 확인 |
router.get('/login', function (req, res) {
if (req.cookies.omg_last_login) {
let date = new Date();
date = date.toISOString().slice(0, 10); //ex)2022-02-10
if (date == req.cookies.omg_last_login) { //omg_last_login 이 오늘인 경우
if (req.user) res.redirect('/'); //session 값이 존재하는 경우
else res.render('account/login.ejs'); //session 값이 존재하지 않는 경우
} else { //omg_last_login cookie가 오늘 날짜가 아닌 경우 (로그인 시간 만료)
if (req.user) { //로그인 시간이 만료되었으나 session 값이 남아 있는 경우
req.logout(); //session 값 파기 후 login 페이지로 이동
req.session.destroy(() => {
req.session;
});
}
res.render('account/login.ejs'); //로그인 시간도 만료되었고 session 값도 없으므로 login 페이지 이동
}
} else if (req.user) res.redirect('/'); //omg_last_login cookie가 없고 session값만 있는 경우 (=자동 로그인으로 로그인)
else res.render('account/login.ejs'); //그 외의 경우는 로그인 시도가 없던 것이므로 로그인 페이지로 이동
},
❕ 조금 불필요한 자원들이 소모되도록 구현된 자동 로그인이라 조금 더 가다듬어서 활용 해야 할 것 같다.
'Back End > Server' 카테고리의 다른 글
[Server] Jwt Token vs Session -1- (Session편) (0) | 2022.10.14 |
---|---|
[Server] node.js 비밀번호 초기화 API 구현 (0) | 2022.02.12 |
[Server] Open API인 KaKao Map을 이용하여 위도 경도 얻기 (0) | 2022.02.10 |
[Server] Open API인 KaKao Map을 이용하여 위치를 지도에 표시하기 (0) | 2022.02.06 |
[Node.js vs Spring] Node.js vs Spring의 차이 (5) | 2021.12.28 |