이번 파트에서는
resave
와saveUninitialized
의 차이점과false로 바꾸는 것에 대해 알아본다.
resave: true,
saveUninitialized: true,
이 부분이다.
session authentication(인증)
을 사용하면서 생길 수도 있는 문제에 대해서 배울수 있다.
보이고 있는 쿠키를 지운다. 새로고침하면 새로운 쿠키가 생긴다. 이 과정은 자동으로 이뤄지는거고,
DB
에도 저장 되었다. 다시 쿠키를 지워 본다. 새로고침하면 쿠키가 없는 상태였기 때문에
쿠키를 하나 받았고, DB
에도 하나 더 생겼다.
이말은 방문하는 모든 사용자에 대해 쿠키를 만들어주고 세션을 만든다는 거다.
사용자에게 쿠키를 주고 session
은 DB
에 저장 하는거다.
만약 봇(가짜사람)이 웹사이트를 방문하거나 , 로그인하지 않고 구경만 하려는 사용자들이 방문했다고 하면
모든 방문자에 대해 쿠키랑 session
을 만들고 session
을 DB
에 모두 저장하는데
그건 좋은 생각이 아니다. 아마도 로그인한 사용자의 session
만 저장하는게 좋을 거다.
익명 사용자까지 신경 쓸 필요는 없다. 지금은 브라우저가 백엔드에 접근 할때마다
DB
에 쿠키와 session
을 하나씩 저장하고 있다.
다시 말하지만 이게 좋지 않을 수도 있다. 만약 10만명의 방문자가 온다고 가정해 본다.
그 10만명의 session
을 만들건가? 그러면 큰 DB
를 유지하기 위해 많은 돈을 써야 한다.
해결책은 모든 방문자에 대해서 쿠키를 주지 않는 거다. 왜냐하면 그럴 필요가 없다.
기억하고 싶은 사용자에 대해서만 쿠키를 주는 거다. 만약 홈페이지에 방문해서 동영상을 찾아보거나
뭘 하든지간에 기억할 필요가 없기 때문에 쿠키를 주지 않아도 되는거다.
하지만 로그인을 한다면? 그때는 쿠키를 넘겨 주는거다.
그래서 resave를 false로 바꿔본다.
server.js
에서
resave: false,
saveUninitialized: false
saveUninitialized
도 false
로 바꿔 주었다. 그리고 브라우저에서 쿠키를 지운다.
그리고 모든 세션을 지워 준다. db.sessions.remove({})
입력해주고
db.sessions.find()
입력해서 확인해 보면 DB
에 세션이 남아 있지 않다.
이제 웹사이트를 방문 할거고 쿠키를 받는지 확인한다. 새로고침을 하였으나 쿠키를 주지 않는다.
이제 웹사이트의 방문자인데도 받는 쿠키가 없는거다. DB
도 한번 확인한다.
여기도 session
이 없다.
saveUninitialized: false,
그러면 이 설정은 무엇을 의미하는 걸까? 보다시피 saveUninitialized
가 false
이다.
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
를 보면 세션이 있다.
loggedIn
이 true
고 user
정보도 있다.
이제 기억하고 싶은 사람들에게만 쿠키를 주고 있는데 그게 바로 유저인거다.
익명 사용자 말고 로그인한 사람들이다.
다음 파트에서 알아볼거지만 이 세션은 더 많은 설정을 가지고 있다.
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
에는 username
과 password
가 있기 때문이다.
지금은 괜찮다 왜냐하면 Mongo URl
은 현재 localhost
이니깐 각자 다 다르기 때문이다.
어쨌든 웹사이트를 배포할때 이런식으로 string
을 복붙하지 않는게 좋다.
왜냐하면 누군가가 DB URl
을 알고 연결 할수 있기 때문에 위험하다.
secret
도 마찬가지이다. 다음 파트에서는 쿠키에 대해 더 알아 볼건데 아직 이해하지 못한 field
가 있기 때문이다.
예를 들어 Domain
과 session
이라고 적힌 Expires
에 대해 알아 보겠다.
그리고 HttpOnly
와 Secure
도 알아 볼거다. 쿠키를 구성하고 있는 것이기 때문이다.
그리고 코드에서 string
을 사용은 하지만 숨길 수 있는 방법도 알아 볼거다.