Uninitialized Sessions

0_CyberLover_0·2022년 4월 16일
0

Node.JS # 04

목록 보기
17/19

이번 파트에서는 resavesaveUninitialized의 차이점과

false로 바꾸는 것에 대해 알아본다.

resave: true,
    saveUninitialized: true,

이 부분이다.

session authentication(인증)을 사용하면서 생길 수도 있는 문제에 대해서 배울수 있다.

보이고 있는 쿠키를 지운다. 새로고침하면 새로운 쿠키가 생긴다. 이 과정은 자동으로 이뤄지는거고,

DB에도 저장 되었다. 다시 쿠키를 지워 본다. 새로고침하면 쿠키가 없는 상태였기 때문에

쿠키를 하나 받았고, DB에도 하나 더 생겼다.

이말은 방문하는 모든 사용자에 대해 쿠키를 만들어주고 세션을 만든다는 거다.

사용자에게 쿠키를 주고 sessionDB에 저장 하는거다.

만약 봇(가짜사람)이 웹사이트를 방문하거나 , 로그인하지 않고 구경만 하려는 사용자들이 방문했다고 하면

모든 방문자에 대해 쿠키랑 session을 만들고 sessionDB에 모두 저장하는데

그건 좋은 생각이 아니다. 아마도 로그인한 사용자의 session만 저장하는게 좋을 거다.

익명 사용자까지 신경 쓸 필요는 없다. 지금은 브라우저가 백엔드에 접근 할때마다

DB에 쿠키와 session을 하나씩 저장하고 있다.

다시 말하지만 이게 좋지 않을 수도 있다. 만약 10만명의 방문자가 온다고 가정해 본다.

그 10만명의 session을 만들건가? 그러면 큰 DB를 유지하기 위해 많은 돈을 써야 한다.

해결책은 모든 방문자에 대해서 쿠키를 주지 않는 거다. 왜냐하면 그럴 필요가 없다.

기억하고 싶은 사용자에 대해서만 쿠키를 주는 거다. 만약 홈페이지에 방문해서 동영상을 찾아보거나

뭘 하든지간에 기억할 필요가 없기 때문에 쿠키를 주지 않아도 되는거다.

하지만 로그인을 한다면? 그때는 쿠키를 넘겨 주는거다.

그래서 resave를 false로 바꿔본다.

server.js에서

resave: false,
saveUninitialized: false

saveUninitializedfalse로 바꿔 주었다. 그리고 브라우저에서 쿠키를 지운다.

그리고 모든 세션을 지워 준다. db.sessions.remove({}) 입력해주고

db.sessions.find()입력해서 확인해 보면 DB에 세션이 남아 있지 않다.

이제 웹사이트를 방문 할거고 쿠키를 받는지 확인한다. 새로고침을 하였으나 쿠키를 주지 않는다.

이제 웹사이트의 방문자인데도 받는 쿠키가 없는거다. DB도 한번 확인한다.

여기도 session이 없다.

saveUninitialized: false,

그러면 이 설정은 무엇을 의미하는 걸까? 보다시피 saveUninitializedfalse이다.

A session is uninitialized when it is new but not modified.

세션이 새로 만들어지고 수정 된적이 없을때 Uninitialized이라고 한다.

그래서 새로운 세션이 있는데 수정된 적이 없으면 Uninitialized(초기화되지 않은)인거다.

그러면 세션은 어디에서 수정해야 할까? 세션은 한 곳에서만 수정될 수 있는데

바로 userController이다 여기가 바로 세션을 수정하는 곳이다.

  req.session.loggedIn = true;
  req.session.user = user;
};

이 두줄이 실제로 세션을 initialize(초기화)하는 부분인거다. 왜냐면 이걸 기억하기 때문이다.

그래서 이 설정이 뭘 하는거냐면 세션을 수정 할때만 세션을 DB에 저장하고 쿠키를 넘겨 주는거다.

로그인 할때만 세션을 수정하고 있는 거다.

다른 말로 표현하자면 백엔드가 로그인한 사용자에게만 쿠키를 주도록 설정되었다는 말이다.

익명 사용자에게는 쿠키를 주지 않는거다.

이게 좋은 생각인게 백엔드가 DB에 저장하는게 session인증에서의 문제점 중 하나이다.

이걸 위한 해결책이 있는데 바로 token authentication이다.

예를 들어 iOS나 안드로이드 앱을 만들때 이것들은 쿠키를 갖지 않기 때문에 token을 사용한다.

하지만 여기서는 다르다. 브라우저에서 인증을 하니까 쿠키를 이용해서 세션 인증을 할수 있다.

물론 브라우저에서 token을 사용해도 되지만 현재 시점에서는 어려운 내용이니 넘어 가도록 한다.

어쨌든 session authentication은 브라우저에서 잘 작동한다.

그럼 실제로 세션을 수정해 보도록 한다. 로그인해서 맞는지 한번 보도록 한다.

그게 맞다면 로그인 했을때 그때서야 쿠키를 받고 DB에 세션이 저장될거다.

로그인을 해보았다. 세션을 받았고, 세션 DB를 보면 세션이 있다.

loggedIntrueuser정보도 있다.

이제 기억하고 싶은 사람들에게만 쿠키를 주고 있는데 그게 바로 유저인거다.

익명 사용자 말고 로그인한 사람들이다.

다음 파트에서 알아볼거지만 이 세션은 더 많은 설정을 가지고 있다.

app.use(
  session({
    secret: "Hello!",
    resave: false,
    saveUninitialized: false,
    store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
  })
);

게다가 secret이라는게 있는데 이전 파트에서 말했듯이 이 부분을 보호해야한다.

왜냐하면 이 부분이랑 URL부분은 코드에서 보이면 안된다.

왜냐하면 웹사이트를 서버에 배포 할 때 DB URL을 여기 그냥 두면 안된다.

DB에는 usernamepassword가 있기 때문이다.

지금은 괜찮다 왜냐하면 Mongo URl은 현재 localhost이니깐 각자 다 다르기 때문이다.

어쨌든 웹사이트를 배포할때 이런식으로 string을 복붙하지 않는게 좋다.

왜냐하면 누군가가 DB URl을 알고 연결 할수 있기 때문에 위험하다.

secret도 마찬가지이다. 다음 파트에서는 쿠키에 대해 더 알아 볼건데 아직 이해하지 못한 field가 있기 때문이다.

예를 들어 Domainsession이라고 적힌 Expires에 대해 알아 보겠다.

그리고 HttpOnlySecure도 알아 볼거다. 쿠키를 구성하고 있는 것이기 때문이다.

그리고 코드에서 string을 사용은 하지만 숨길 수 있는 방법도 알아 볼거다.

profile
꿈꾸는 개발자

0개의 댓글