[Node.js MongoDB] 22-25강 정리

jiyseo·2022년 7월 28일
0

Node.js

목록 보기
4/5

22강 세션, JWT, OAuth 회원인증 방법론

회원인증 방법

  1. session-based
    • 로그인 시 쿠키(브라우저에 저장할 수 있는 긴 문자열 세션 아이디가 적힌)를 서버에 저장
    • 브라우저에 쿠키 보내고 브라우저에 쿠키 저장
    • 서버가 로그인 했는지 판단 후 마이페이지 보여주세요! 하면 마이페이지.html 보여줌
  2. token-based (JWT)
    • 브라우저에 로그인 시 서버는 JSON Web Token(암호화된 긴 문자열)을 발행
    • 브라우저에 저장
    • 마이페이지에 접속 요청 시 웹 토큰(유통기한이 있는 열쇠방식)을 헤더에 함께 전송하면 마이페이지 보여줌
    • 특징 : 서버가 메모리 공간에 로그인 상태를 저장할 필요 없음
  3. Open Authentication (OAuth)
    • 다른 사이트의 프로필 정보를 가져옴 (ex. Google, Naver, Facebook)
    • 로그인 시 구글이나 페이스북 개인정보 동의 창이 뜸
    • 동의하면 email, 이름, 성별 등을 공유받아 계정, 세션, JWT 발급 등을 함

23강 회원 인증 기능 로그인 페이지, 아이디 비번 검사

세션 방식 로그인 기능 구현

  1. 라이브러리 3개 설치 (아래와 같이 하면 한 번에 여러개 설치 가능)
  • npm install passport passport-local express session
  1. server.js에 다음 코드 추가
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');

app.use(session({secret : '비밀코드', resave : true, saveUninitialized : false}));
app.use(passport.initialize());
app.use(passport.session());

app.use(미들웨어)

미들웨어 : 요청 - 응답 중간에 뭔가 실행되는 코드

로그인을 하면 아이디 비번 검사

passport - 로그인 기능 쉽게 도와줌

아이디 비번 인증하는 세부 코드 (passport 라이브러리 예제코드)

인증방법은 Strategy 라고 부름

passport.use(new LocalStrategy({
  usernameField: 'id',
  passwordField: 'pw',
  session: true,
  passReqToCallback: false,
}, function (입력한아이디, 입력한비번, done) {
  //console.log(입력한아이디, 입력한비번);
  db.collection('login').findOne({ id: 입력한아이디 }, function (에러, 결과) {
    if (에러) return done(에러)

    if (!결과) return done(null, false, { message: '존재하지않는 아이디요' })
    if (입력한비번 == 결과.pw) {
      return done(null, 결과)
    } else {
      return done(null, false, { message: '비번틀렸어요' })
    }
  })
}));

24강 아이디, 비번을 DB와 비교하고 세션 만들어주기

done(서버에러, 성공 시 사용자 DB 데이터, 에러메시지)

두번째 파라미터에 아이디, 비번 틀리면 false 넣어야함

id, 비번 점검 시 user로 보냄 → 세션 데이터를 만들고 세션의 id 정보를 쿠키로 보냄

//세션을 저장시키는 코드 (로그인 성공 시 발동)
passport.serializeUser(function(user, done){
    done(null, user.id)
});

//이 세션 데이터를 가진 사람을 DB에서 찾아주세요마이페이지 접속 시 발동
passport.deserializeUser(function(id, done){
    done(null, {})
});
  1. 누가 로그인하면 local 방식으로 아이디/비번 인증
  2. db.collection~~ 가 인증하는 코드
  3. 인증 성공하면 세션 + 쿠키 만들어줌

쿠키는 검사 → 어플리케이션 → 쿠키 에서 확인 가능

value가 세션 아이디

25강 로그인 유저만 접속할 수 있는 페이지 만들기

마이페이지 접속 전 실행할 미들웨어

app.get('/mypage', logincheck, function(req, res){ // 미들웨어 쓰는 법
	res.render('login.ejs')
});

function logincheck(req, res, next){
    if (req.user){ //req.user가 있는지 확인
        next() //다음으로 통과
    } else { //없다면 에러메시지
        res.send('로그인 안하셨는데용')
    }
}

로그인 후 세션이 있으면 req.user가 항상 있음

//세션을 저장시키는 코드 (로그인 성공 시 발동)
passport.serializeUser(function(user, done){
    done(null, user.id)
});

//이 세션 데이터를 가진 사람을 DB에서 찾아주세요마이페이지 접속 시 발동
passport.deserializeUser(function(id, done){
    //디비에서 위에 있는 user.id로 user를 찾은 뒤 유저 정보를 ret에 넣음
    db.collection('login').findOne({id : id}, function(error, ret){
        done(null, ret);
    });
});

deserializeUser() : 로그인한 유저의 세션 아이디를 바탕으로 개인정보를 DB에서 찾는 역할

user.id 가 passport.deserializeUser(function(id, done))의 id로 전달

로그아웃을 구현하던 중

app.post('/logout', function(req, res) {
  req.logout();
  res.redirect('/');
});

여기서 자꾸 오류가 나서 검색해보니 업데이트 후 동기식이었던 req.logout()이 비동기식 기능으로 바꼈다는 것을 들었다

이렇게 수정하니 됨

app.post('/logout', function(req, res) {
  req.logout(function(err) {
    if (err) { return next(err); }
    res.redirect('/');
  });
});

회원가입은 이렇게 구성하였다

app.get('/signup', function(req, res){
    res.render('signup.ejs');
});

app.post('/signup', overlap_check, function(req, res){
    res.send('signup complete');
    db.collection('login').insertOne({id : req.body.id, pw : createHashedPassword(req.body.pw)}, function(error, res){ // Object 자료형, req.body라고 하면 요청했던 form에 적힌 데이터 수신가능
        console.log('save complete');
        if (error){return console.log(error)};
    });
});

아이디 중복 처리

profile
코딩뿡뿡이

0개의 댓글