User 의 로그인 여부 확인 (session)

‍정진철·2023년 1월 11일
0

Nodejs

목록 보기
7/10

1. express-session 모듈

express-session 설치 후 해당 미들웨어 가져오기.
const session = require('express-session')

( cookie는 서버가 브라우저에 주는 정보인데 cookie에는 정해진 규칙이 있기 때문에 브라우저에서 매번 request를 보낼 때 마다 브라우저는 알아서 해당 요청에 cookie를 덧붙임 -> 이것을 위해서 개발자가 따로 해야 할 것은 없음)

session middleware가 브라우저에 cookie 전송 -> 브라우저는 cookie로 무엇을 할 지, 어디에 넣을지 알고있음.

또한 브라우저가 매번 특정 url로 서버에 요청을 보낼 때 마다 해당 쿠키도 함께 전송된다는 걸 알고있음.

쿠키가 가지고 있는 정보

어떤 정보든 삽입 가능.
(숫자, 이름, anything) !! ... 우리가 넣을 것은 sessin ID !

쿠키에 세션 ID를 넣자 !!

세션 아이디를 부여하는 이유는 브라우저와 서버와의 연결성이 평생 보장된 것은 아니기 때문!! (we are using stateless HTTP !! )

따라서, 상황정리를 하자면
브라우저는 세션아이디가 삽입된 쿠키를 가지고 있는 서버는 해당 세션 아이디를 기억하고 있는 중 !!

쿠키는 그저 정보를 주고 받는 '수단'에 불과한 것이고
실질적으로 서버와 브라우저 간에 서로를 인식하는 방법은 SESSION ID!!!

백엔드에서 모든 세션 ID를 관리하고 유저가 100명이면 세션 id 역시 100개가 존재하게 됨.


로그인 시

위의 로그인(POST) 코드에서 req.session.loggedIn, req.session.user 를 이용할 것임.

각각의 세션 정보는 브라우저 마다 다름.

세션은 obejct이므로 어느 속성이든 추가 시킬 수 있음 ( loggedIn, user ... )

따라서 어느 컨트롤러에서나 해당 세션에 추가된 속성을 가져가 쓸 수 있음 !!


locals

위의 base.pug 에서 loggedIn이라는 변수를 따로 렌더링 하지 않아도 사용이 가능했는데 그 이유는 아래와 같은 미들웨어를 만들어 줬기 떄문이다.

locals 는 추가를 해도 되고 제거를 해도 되고 해당 obejct 안에는 무엇이든 넣어도 됨.

그리고 가장 중요한 건 템플릿 마다 locals 에 자동으로 접근이 가능하다는 점이다 !!

따라서 loggedIn, siteName, loggedUser등과 같은 속성을 locals에 부여했다면 pug파일에서 렌더링 안해줘도 사용 가능!

정리하자면


사용자를 로그인 상태로 변경시킬 수 있는건 세션정보에 넣어주는 것!
(req.session.isLoggedIn)


Mongostore

쿠키에는 세션 id 정보만 저장되고 session 관련 데이터는 저장되지 않음.

세션 데이터는 서버쪽에 저장됨.

또한 서버에 저장되는 Default server-side session storage 는 MemoryStore 이고 실제 사용하기 위해 존자하는 것은 아님.

따라서 우리는 Session Store 를 사용해야함.

즉, 세션을 데이터베이스에 저장해야함.

세션을 별도의 데이터베이스에 저장하지 않으면 세션이 서버의 메모리에 저장되므로 서버를 재시작 할 때 마다 메모리가 지워지므로 database에 저장시키는 것.

connect-monogo

connect-mongo는 세션을 MongoDB에 저장시킴.

따라서 우리가 서버를 재시작하더라도 세션은 데이터베이스에 저장되므로 사용자의 로그인 상황을 잊지 않게됨.

MongoStore 설치

Mongo Database의 URL을 가지고 있는 configuration object를 만들어야함.

세션 저장소 생성

세션은 브라우저가 서버에 방문했을 때 생성됨


Uninitialized Sessions

우리가 "모든" 방문자에 대해 쿠키와 세션을 모두 DB에 저장하는 것은 바람직 하지 못함.

로그인에 성공한 유저만 저장하도록 해야함.

따라서 서버는 내가 기억하고 싶은 유저에게만 쿠키를 부여해주면 됨.

이렇게 하면 로그인하지 않으면 서버를 재시작해도 쿠키 재부여가 안됨.

  • resave false : 모든 request마다 세션의 변경사항이 있든 없든 세션을 다시 저장한다.
    false: 변경사항이 없음에도 세션을 저장하면 비효율적이므로 동작 효율을 높이기 위해 사용한다.
  • Uninitialized : false 의 의미는 새로운 세션이 수정된 적 없으면 초기화 시키지 않는다는 것이고, 세션을 수정하는 곳은 로그인 컨트롤러에서 이루어진다.


profile
WILL is ALL

0개의 댓글