tech.junha.kr

사용자 인증 미들웨어: PassportJS

6.0 passport js

사용자 인증 구현시켜주는 미들웨어 인증이란 브라우저 상에 쿠키를 설정해주면, 그 쿠키를 통해서 사용자 ID등을 알 수 있을 것이고, Passport가 브라우저에서 자동으로 쿠키를 가져와서 인증이 완료된 user object를 controller에 넘겨준다. <쿠키 그림> 쿠키에는 모든 request에 대해 백앤드로 전송될 정보들이 담겨 있다. passport역할 쿠키 생성 브라우저에 저장 유저에게 해당 쿠키를 전달 pssport integration passport.autheriface('strategy')작동 후 req.user가 생기며, 그것은 현재로그인한 사용자가 된다. passport local mongoose npm install passport-local-mongoose 사용자 기능을 추가하는 것이다 user model을 위한 거다 사용자 인증이 필요한 기본적인 것들을 다 만들어준다 패스워드 변경, 패스워드 확인, 패스워드 생성, 패스워드 암호화 설치해서 사용하기만하면 된다.

6.1 Local Authenrication with passport passport local mongoose는 설정객체가 필요함 passportlocal mongoose에게username이 될 field명을 명시해줌 passport.js생성 npm i passport passport-local passport-local이란 username과 password를 스는 사용자 인증 방식을 의미 passport.use() passport에게 strategy를 쓰라곡 말한다 strategy: 로그인 하는 방식 with facebook, with id pw passportlocalmongoose가 쓰는 걸 전달 User.createStrategy() : createStrategy는 이미 구성이 된 passport-local의 LocalStrategy를 생성한다.

6.2 쿠키: 사용자 ID:1 같은 정보를 저장하는 공간 Serialization : 어떤 field가 쿠키에 포함될 것인지 알려주는 역할 (쿠키는 아주 작아야하고, 민감한 정보는 담지않아야함) 누군가가 정보에 접근할 수 ㅣㅆ음 serializeUser: 쿠키에 user.id만 담아라 deserial izeUser: 어떤 사용자인지 어떻게 찾지에 관한 것 쿠키의 정보를 어떻게 사용자로 전환하는지 의미 id로 사용자를 식별한다 [passport serialize 그림] passport가 사용자 인증 처리하도록 설정함 passport-loacal-mongoose덕분에 숏컷함수로 처리 postJoin 부분수정 User.create는 데이터베이스까지 저장이므로 User({})로 씀 mongo에서 db.users.find({}) db.users.remove({})

6.3 passport.authenricate('local') 로컬은 우리가 설치해준 strategy의 이름 리다이렉트 코드 미들웨어js에서 res.locals.user = req,user passport가 사용자를 로그인시켜줄 때 passport는 쿠키나 serialize, deserialize등의 기능을 다 지원해줌은 물론이고user가 담긴 object를 요청에도 올려준다 app.js에서도 import passport app.use(passport.initalize) 마지막 위치에 써준 이유는 위에서 실행된 쿠키파서로부터 쿠키가 쭉 내려와 passport가 스스로 쿠키를 들여다보고 쿠키 정보에 해당하는 사용자를 찾아줌 그리고 찾은 사용자를 요청의 object req.user로 만들어준다 header.pug에 user.isautheticated에서 사용자인증이 되었나 확인하는 부분이 작동 || user 유저가 존재하지 않다면 비어있는 object를 줌 app.js에서 import ./passport까지, passport설정파일인

6.4 npm install express-session app.use(session) 니꼴라스가 세션 옵션설정할 때 인터넷 설명서 읽어보고, secret이라는 핵심변수만 기억하고있었음 secret이란 무작위 문자열로서 쿠키에 들어있는 session ID를 암호화하기 위한 거야 secret값을 .env값으로 저장 random keygen 사이트에서 대충골라옴 오류 읽고 resave, saveUninitialized가 필요한 옵션인것을 알고 설명서에 나와있는 기본 값 권장사항들을 일단은 따라적엇음 웹 서버로 쿠키를 전송할 때 마다 서버에서는 passport 인증과정을 호출하고 passport는 deserialize를 통해 내가 어느 사용자인지 식별할 수 있게 된다. req.use는 어디든 있음. 쿠키가 있기 때문 이 쿠키는 express로 보내지고 있다. express는 session을 이용함으로써 쿠키를 손에 쥘수있음 그리고 passport를 통해서 우리는 session을 ㅣ용하는데 즉 세션이 가진 쿠키를 이용한다는 걸의미한다. 그 패스포트로 deserialieze를 진행하는 것 왜냐면 세션은 쿠키를 해독하기 때문 passport로 넘겨지면 deserializeUser함수가 실행 사용자를 식별하면 패스포트는 방금찾은 사용자를 미들웨어나 routes의 request object에 할당하게 됌 그래서 어느 라우트에서든 로그인한 사용자가 누구인지 체크할 수 있다 서버를 재실행할때마다 세션정보를 잃게된다. 왜냐하면 세션정보, 쿠키정보들을 메모리에 저장하고 있기 때문이다. 세션을 유지해야한다...다음으로 app.use(passport.session)

6.5
mongoDB를 사용해서 세션을 저장할거임
설정다아는게 아님 니꼬도 과제를 완수하기만하길 바란대
connect-mongo다운 저장소 생성
connect mongo를 써서 session에게 데이터를 MongoStore라는 저장소에 저장하라고 알려주고 있어
npm i connect mongo
import MongoStore from "connect-mongo"

Passport JS

is an authentication middleware

Passport JS 용어

  • Strategy: Options of authentication mechanism
  • local: Name of strategy for username/password to authenticate in Passport
  • Provider: External website that will authenticate the user
  • Serialization: Function where we can decide what information the cookie will have
  • Deserialization: Function where we turn the cookie into an user object

Where does passport store the sessions

Cookies

How often are cookies sent to the server

Every Request

After deserialization, how does passport gives us the user object?

It puts it in 'req.user'

What happens if we don't use a CookieStore?

The cookies will not be persistent