Session & Session-based Authentication μ λμ κ³Όμ
π Session ?
ν΄λΌμ΄μΈνΈκ° μλ²μ data λ₯Ό μ μ₯ν μ μλ λ°©λ² μ€ νλλ‘, νΉμ μ μ₯ 곡κ°μ μλ―Ένλ€.
session μ νΉλ³ν κ²½μ°κ° μλλΌλ©΄ μ¬μ©μκ° μΉ λΈλΌμ°μ λ₯Ό μ μν μμ λΆν° μ’ λ£νλ μμ κΉμ§ μ μ§λλ€.
π Session-based Authentication λμ κ³Όμ ?
π express-session λͺ¨λ
// express-session λͺ¨λ
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: ,
resave: ,
saveUninitialized: ,
.
.
.
cookie: {
domain: ,
path: ,
maxAge: ,
sameSite: ,
httpOnly: ,
secure: ,
.
.
.
}
})
);
μλ²λ₯Ό μμ±νλ©΄μ session λ―Έλ€ μ¨μ΄λ₯Ό μ½μ ν΄μ£Όλ©΄, μλ² μΈ‘μ data λ₯Ό μ μ₯ν μ μλ session μ΄ μμ±λλ€.
// controller/users/login.js
// DBμμ λΆλ¬μ¨ Users TABLE
const { Users } = require('../models'); // (model/index.js)
module.exports = {
post: async (req, res) => {
// Users ν
μ΄λΈμμ μμ²κ³Ό μΌμΉνλ μ 보λ₯Ό query ν΄μ¨λ€.
const userInfo = await Users.findOne({
where: { userId: req.body.userId, password: req.body.password },
});
if(!userInfo){
// λ±λ‘λ νμμ΄ μλλΌλ©΄ μ κ·Ό λΆκ°νλ€κ³ μλ €μ€λ€.
res.status(401).send({ data: null, message: 'not authorized' });
}
else{
// λ±λ‘λ νμμ΄λΌλ©΄ μΈμ
μ μΈμ
μμ΄λ κ°μ λ£μ΄μ€λ€.
// μ¬κΈ°μ μΈμ
μμ΄λλ₯Ό κ·Έλ₯ μΌλ° κ°μΌλ‘ λ겨쀬μ§λ§, μνΈνν΄μ λ겨주λ κ²½μ°κ° λ§λ€.
req.session.session_id = userInfo.userId;
// μΈμ
μ μΈμ
μμ΄λλ₯Ό λ£μ΄μ€¬λ€λ©΄ μΌμΉνλ νμ μ 보λ₯Ό bodyμ λ΄μ μλ΅νλ€.
res.status(200).json({ data: userInfo, message: 'ok' });
}
}
};
DB μμ μνλ μ 보λ₯Ό κ°μ Έμ session ID μ ν¨κ» μλ΅ν΄μ€λ€.
// controller/users/userinfo.js
// DBμμ λΆλ¬μ¨ Users TABLE
const { Users } = require('../models'); // (model/index.js)
module.exports = {
get: async (req, res) => {
// μμ²μ session_id κ°μ΄ ν¬ν¨λμ΄ μμ§ μλ€λ©΄,
if(!req.session.session_id){
// λ±λ‘λ νμμ μ 보λ μμΌλ―λ‘, μΉμΈμ κ±°λΆνλ€.
res.status(400).send({ data: null, message: 'not authorized' });
}
else {
// session_id κ°μ κ°μ§κ³ μλ€λ©΄,
// session_id κ°κ³Ό μΌμΉνλ μ λ³΄κ° λ΄κΈ΄ νμ μ 보λ₯Ό λΆλ¬μ¨λ€.
// μλ² μΈμ
μ λͺ¨λ μ λ³΄κ° μ μ₯λμ΄ μμΌλ―λ‘, μλ²μμ λΉκ΅κ° μ§νλλ€.
const userData = await Users.findOne({
where: { userId : req.session.session_id.userId },
});
// μΌμΉνλ μ 보λ₯Ό λ΄μ μλ΅νλ€.
res.status(200).json({ data: userData.dataValues, message: 'ok' });
}
},
};
λ‘κ·ΈμΈ ν ( session ID λ₯Ό μ·¨λν ν ) νμ μ 보λ₯Ό μ»μ λ
ν΄λΌμ΄μΈνΈκ° λ³΄λΈ μμ²μ λ€μ΄μλ session ID μ μλ²μ μ μ₯λ session ID λ₯Ό λμ‘°νμ¬ μΌμΉνλ μ 보λ₯Ό λ°ννλ€. !-!
π μΆκ° μ§λ¬Έ μ¬ν
μ½λλ₯Ό 보면, session μ session_id λ₯Ό μ μ₯νλ λΆλΆμ μμ΄λ
ν΄λΌμ΄μΈνΈμκ² ( set-cookie λ₯Ό μ΄μ©νλ req.cookie( ) λ₯Ό μ΄μ©νλ ) cookie λ‘ μ λ¬ν΄μ£Όλ λΆλΆμ μλ€.
λ°λ‘ ꡬννμ§ μμλ λλκ±΄μ§ λ΄κ° λΉΌλ¨Ήμ κ±΄μ§ μμλ³Ό κ²
-> μ€μ€λ‘ λ΄λ¦° κ²°λ‘
express-session μ μ΄μ©ν΄ μμ±ν session κ°μ²΄ μμ cookie μ λ³΄κ° ν¬ν¨λμ΄μλλ°,
μ΄λ₯Ό session-cookie λ‘ ν΅ν©ν΄μ λ΄μΌν κ² κ°λ€.
κ·Έλμ μλ²μͺ½μμ λ°λ‘ μΏ ν€λ₯Ό μ€μ νμ§ μμλ session μμ μνλ ν€μ κ°μ λ£μ΄μ£Όλ©΄
μλμΌλ‘ ν΄λΌμ΄μΈνΈμκ² μ μ‘λ μΏ ν€κ° μμ±λλ κ² μλκ° ...! μΆμΈ‘ .
express-session μλκ³Όμ μ μ ννλ λͺ¨λ₯΄κ² λ€. μμ²κ³Ό μλ΅ μ¬μ΄λ₯Ό λ―μ΄λ³΄λ μλ°μ.