1. Passport.js
- Express.js 앱에 간단하게 사용자 인증 기능을 구현하게 도와주는 패키지
유저 세션 관리 및 다양한 로그인 방식 추가 가능
- 다양한 strategy를 이용해 여러 로그인 방식을 구현할 수 있다.
1.1 local strategy 구현
const config = {
usernameField: 'email',
passwordField: 'password',
}
const local = new LocalStrategy(config, async (email, password, done) => {
try {
const user = await User.findOne({ email });
if (!user) {
throw new Error('회원을 찾을 수 없습니다.');
}
if (user.password !== password) {
throw new Error('비밀번호가 일치하지 않습니다.');
}
done(null, {
shortId: user.shortId,
email: user.email,
name: user.name,
});
} catch (err) {
done(err, null);
}
}
const local = require('위에서 작성한 local strategy 경로')
module.exports = () => {
passport.use(local);
passport.serializeUser((user, callback) => {
callback(null, user);
});
passport.deserializeUser((obj, callback) => {
callback(null, obj);
});
}
- session을 이용해 user를 사용할 때에는 반드시 설정해줘야하는 부분
session에서 user정보를 변환하여 저장하고 가져오는 역할이다.
ex) 회원 id만 세션에 저장하고 사용 시 회원 정보를 DB에서 찾아서 사용
router.get('/', passport.authenticate('local'));
const session = require('express-session');
app.use(session({
secret: 'secret',
resave: false,
saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/auth', authRouter);
- express-session과 passport.session()을 사용해 로그인 시 유저 정보를 세션에 저장하고 가져오는 동작을 passport가 수행함.
router.get('/logout', ... {
req.logout();
res.redirect('/');
})
2. Session
- 서버가 클라이언트의 정보를 클라이언트 별로 구분하여 서버에 저장하고 요청시 Session ID를 사용해 클라이언트의 정보를 확인하는 기술
클라이언트에서 정보를 저장하고 요청시 정보를 보내는 Cookie와 대조됨
- 서버는 생성된 세션의 구분자인 Session ID를 클라이언트에게 전달하고 클라이언트가 요청시 Session ID를 함께 담아서 전송하는 방식
2.1 express-session
- 패키지를 이용하면 간단하게 세션 생성, 전달, 확인을 처리할 수 있다.
- 메모리에 저장하기 때문에 구현된 앱을 종료 후 다시 실행하면 모든 유저의 로그인이 해제된다.
session store를 이용하면 session을 공유하기 때문에 종료되어도 정보가 날아가지 않고 한번에 여러 session을 관리할 수 있다.
- connect-mongo패키지를 이용해 mongoDB를 스토어로 사용할 수 있음.
const MongoStore = require('connect-mongo');
app.use(session({
secret: 'SeCrEt',
resave: false,
saveUninitialized: true,
store: MongoStore.create({
mongoUrl: '몸고디비URL',
}),
}));
3. MongoDB Aggregation
- MongoDB에서 document들을 가공하고 연산하는 기능. RDBMS에서 SQL로 수행할 수 있는 기능들을 유사하게 구현할 수 있음
ex) SQL의 GROUP BY, DISTINCT, COUNT, JOIN등