ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [로그인]
    React/프로젝트 2022. 1. 24. 15:20

    < 로그인 로직 순서 >

    1. DB에 요청한 E-mail 찾기
      • User.findOne( )
    2. DB에서 요청한 E-mail이 있다면 비밀번호가 같은지 확인
      • user.comparePassword( )
    3. 비밀번호 동일하다면 Token 생성 후 쿠키에 저장
      • user.generateToken( )
      • JSONWEBTOKEN LIB이용
        • npm install jsonwebtoken --save
      • 쿠키에 저장
        • npm install cookie-parser --save
        • cookie-parser => index.js에서 설정
          // index.js
          
          const cookieParser = require("cookie-parser");
          
          app.use(cookieParser());
    // user.js (routes)
    
    const express = require("express");
    const router = express.Router();
    const { User } = require("../models/User");
    
    router.post("/login", (req, res) => {
        User.findOne({ email: req.body.email }, (err, user) => {  // --- ① 요청받은 email 찾기
            if(!user) {
                return res.json({
                    loginSuccess: false,
                    message: "입력하신 이메일에 해당하는 유저가 없습니다.",
                });
            }
            
            // pw find
            user.comparePassword(req.body.password, (err, isMatch) => {  // --- ② pw 확인
                if(!isMatch)
                    return res.json({
                        loginSuccess: false,
                        message: "비밀번호가 틀렸습니다.",
                    });
                
                // token generate
                user.generateToken((err, user) => {   // --- ③ token 생성
                    if(err) return res.status(400).send(err);
                    res.cookie("w_authExp", user.tokenExp);
                    
                    // token store
                    res
                    .cookie("x_auth", user.token)
                    .statue(200)
                    .json({ loginSuccess: true, userId: user_.id });
                });
            });
        });
    });

     

    ① MongoDB - FineOne( ) 메서드
    { field1: <value>, field2: <value> ... }

    [예시]
    db.bios.findOne(
             { contribs: 'OOP' },
             { _id: 0, 'name.first': 0, birth: 0 }
    )

    ③ 쿠키에 저장된 화면

    // User.js (model)
    
    userShema.methods.comparePassword = function (plainPassword, cb) {
    // plainPassword : req.body.password (입력한 비밀번호)
        bcrypt.compare(plainPassword, this.password, function(err, isMatch) {
        // this.password : 해시된 비밀번호 (db 저장 값)
            if(err) return cb(err);
            cb(null, isMatch);
        });
    };
    ② bcrypt.compare( )
    bcrypt.compare(plainPassword, this.password, function(err, isMatch) { });
    입력한 pw와 DB에 저장되어 있던 해싱된 pw가 유효한지 확인
    => true, false 반환

     

    // User.js  (models> User.js)
    
    const jwt = require("jsonwebtoken");
    
    userSchema.methods.generateToken = function (cb) {
        var user = this;
        var token = jwt.sign(user._id.toHexString(), "secretToken");
        
        user.token = token;
        user.save(function(err, user) {
            if(err) return cb(err);
            cb(null, user);
        });
    };
    jwt.sign(user._id.toHexString(), "secretToken");
    => jsonwebtoken을 이용해서 token 생성
    => user._id.toHexString() + secretToken = token
    => token 해석 시, secretToken을 통해 user_.id나온다.
    jwt?
    각 객체 사이에서 속성 정보를 JSON데이터 구조로 표현하고 암호화를 통해 정보를 전달하는 Token이 대표

     

    • toHexString( )
      ObjectID형태의 id를 24바이트의 hex문자열로 바꾸어 리턴해주는 함수. (mongoDB 저장값 확인)

      toString( )과 차이?
      => toString( )은 toHexString( )리턴
      => toString( )이 toHexString( )의 상위 함수.

      toHexString( ) 사용 이유
      => toString( )에 포함되어서 더 좁은 의미의 함수이기 때문에 예외발생률이 적어서 사용된다고 함.
    쿠키 vs 세션
    • 쿠키
      • 유저들의 효율적이고 안전한 웹 사용을 보장하기 위해 웹 사이트에 널리 사용
      • 웹 사이트는 쿠키를 통해 접속자의 장치를 인식하고
        접속자의 설정과 과거 이용내역에 대한 일부 데이터 저장
      • 세션 쿠기
        • 브라우저를 닫는 경우, 자동으로 삭제되는 쿠키
      • 지속적 쿠키
        • 수동으로 삭제되기 전까지 남아있는 등 더 오랜기간 컴퓨터에 저장되는 쿠키
    • 세션
      • 일정시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고
        그 상태를 일정하게 유지시키는 기술
      • 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위를 보고 세션이라 한다.
      • 쿠키보다 보안이 좋다.
      • 저장데이터에 제한이 없다. (서버 용량이 허용하는 한)

    'React > 프로젝트' 카테고리의 다른 글

    [리액트]  (0) 2022.01.24
    [auth - middleware]  (0) 2022.01.24
    [Bcrypt] - 비밀번호 암호화  (0) 2022.01.21
    [Nodemon]  (0) 2022.01.21
    [express.Router]  (0) 2022.01.20
Designed by Tistory.