Elice SW engineer - TIL day 34

Circlewee·2022년 5월 19일
0

Elice SW 2 TIL

목록 보기
29/31

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에서 찾아서 사용
// routes/auth.js
router.get('/', passport.authenticate('local'));

// app.js
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등
profile
공부할 게 너무 많아요

0개의 댓글

관련 채용 정보