-
[로그인]React/프로젝트 2022. 1. 24. 15:20
< 로그인 로직 순서 >
- DB에 요청한 E-mail 찾기
- User.findOne( )
- DB에서 요청한 E-mail이 있다면 비밀번호가 같은지 확인
- user.comparePassword( )
- 비밀번호 동일하다면 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 - DB에 요청한 E-mail 찾기