Sessions and Cookies #02
일단
server
를 저장하고 재시작하면 어떻게 되는지 본다.
세션이 모두 사라지게 된다. 왜냐하면 express
가 세션을 메모리에 저장하고 있기 때문이다.
그래서 서버를 재시작 할때 마다 세션이 사라지는 거다. 서버가 계속 잊어버리는거다.
fake DB
를 만들었을때처럼 세션도 그렇게 되고 있는거다.
나중에는 백엔드가 잊지 않도록 세션을 mongoDB
와 연결해 볼거다.
지금은 코드들 저장 할때마다 서버가 세션을 잊어버린다.
이제 백엔드가 쿠키를 가지고 어떻게 브라우저를 구분하는지 보도록 한다.
이전 파트에서 백엔드가 브라우저한테 이해할수 없는 텍스트를 보내는걸 봤다.
그런데 이 텍스트가 백엔드에서 세션 id
로 사용되고 있었다.
백엔드의 메모리에 세션을 저장할 수 있는 DB
가 생긴거다.
백엔드의 각 세션들은 id
를 가지고 있었고 그 id
를 브라우저한테 보냈다.
그러면 브라우저가 요청을 보낼때마다 그 id
를 같이 보내준다.
브라우저와 일치하는 세션이 뭔지 알수 있고, 어떤세션이 다른 브라우저와 일치하는지도 알수 있었다.
서로 다른 브라우저에서는 서로 다른 쿠키를 가지고 있기 때문이다.
정리를 해보면 세션과 세션 id
는 브라우저를 기억하는 방식중 하나이다.
그리고 브라우저와 백엔드 사이에는 WIFI
처럼 유지되는 연결이 없으니까
백엔드에 요청을 보낼때 마다 id
를 같이 보내줘야 한다.
그러면 백엔드가 기억 할수 있는거다. 그리고 세션 id
를 가지고 있으면 세션 object
에 정보를 추가 할수 있다.
새로고침을 해보면 현재 백엔드에 등록된 세션이 console.log
되는걸 볼수 있다.
한번더 새로고침을 하면 2개를 볼수 있다. 이제 세션을 저장 할수 있는 DB
같은게 생긴거다.
무슨 말이냐면 DB
에 정보를 넣을수 있다는 말이다. 세션을 위한 정보를 넣을수 있다는 거다.
예를 들어 숫자나 유저의 id
같은 정보를 넣을수가 있다.
원하는 모든 정보를 넣을 수있는데 이 세션에서만 공유 될거다.
이번에는 아주 빠르게
URL
을 하나 만들어 본다.
app.get("/add-one", (req, res, next) => {
return res.send(`${req.session.id}`);
});
get
을 써서 req,res,next
를 받으면 이 url
은 한가지 기능을 하게 만들거다.
res
를 return
해서 req.session.id
를 담은 텍스트를 send
한다.
이 URL
을 /add-one
이라고 한다. 그러면 이제 /add-one
으로 가본다.
보다시피 세션id
가 보이고 있다. 다른 브라우저에서도 확인해 본다. 다른 세션 id
가 나오고 있다.
서로 다른 id
가 나왔다. 브라우저마다 서로 다른 세션 id
를 가진 텍스트를 보내고 있다.
말했다시피 이 세션 id
가 쿠키에도 있다는건 그냥 우연이 아니다.
앞서 봤다시피 정말 간단하다. 서버가 브라우저한테 세션 id
를 주고 있다.
그리고 브라우저가 요청을 보낼때 마다 쿠키에서 세션 id
를 가져와 보내주는거다.
그러면 서버가 그 세션 id
를 읽고 누군지 알수 있는거다. 어떤 브라우저인지도 알수 있다.
한가지 더 하고 싶은게 있다. 여기에 카운터(counter
)를 만들어 본다.
app.get("/add-one", (req, res, next) => {
req.session.potato += 1;
return res.send(`${req.session.id}`);
});
여기있는 세션은 javascript object
이다. 말그대로 javascript object
일 뿐이다.
{
cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' }
},
그리고 서로 다른 브라우저에서 req.session.id
가 다르다는 것도 봤다.
그러면 어떤 정보를 javascript object
에 넣어 본다.
req.session
을 쓰고 potato
라는걸 추가해보았다.
potato
에는 + = 1
이라고 썼다. 세션 object
안에 potato
를 만들었다.
이제 세션 안에 있는 potato
에 1을 더하면 어떻게 나오는지 본다.
새로고침하면 보이다시피 id
가 바뀌었다. 왜냐하면 코드를 저장 할때마다 서버에서 세션을
없애고 새로 만들기 때문이다.
이 문제는 걱정할 필요가 없다. 나중에는 실제 DB
에 연결 할거다. 일단 지금은 세션이 사라진다.
그리고 req.session.potato
를 보내본다.
app.get("/add-one", (req, res, next) => {
req.session.potato += 1;
return res.send(`${req.session.id}\n${req.session.potato}`);
});
뭐가 나오는지 살펴 본다. 새로고침하면 보다시피 NaN(Not a Number)
가 나온다.
이제 다시 새로고침을 해본다. 새로고침 할때마다 카운터가 쌓인다.
콘솔을 보면 potato
가 새로고침한 만큼 숫자인 세션이 있다.
다른 브라우저에서도 새로고침한 만큼의 숫자 세션이 있다. 보다시피 백엔드가 브라우저한테 id
를 주고 있다.
그리고 브라우저가 /add-one..
뿐만 아니라 서버의 모든 URL
을 방문할때 마다
브라우저가 받았던 id
를 요청에 담아 보낼거다. 이 모든걸 알아서 처리한다.
브라우저한테 준
id
를 요청에 담아 보내주고 있다는걸 꼭 기억하자.
데이터를 보내줬던 id
를 백엔드에 요청을 보낼때마다 같이 보내고 있는거다.
그러면 백엔드의 세션 DB
에서 id
를 가진 세션을 찾게 된다.
그리고 그 세션에 정보를 담을 수 있는거다. 그러면 이제 유저 정보를 기억 할수 있고
유저의 세션에 정보를 추가할 수도 있는거다. 아직은 유저가 누구인지 모르고 있다.
알고 있는건 potato
가 다른 한쪽은 몇번을 새로고침을 한것과 다른 한쪽의 potato
는
또 몇번의 새로고침을 했냐는 거다.
여기서 한번 더 홈화면을 방문해본다. 브라우저에서 웹사이트를 방문 할때마다 세션 이 middelware
가
있으면
app.use(
session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
})
);
express
가 알아서 그 브라우저를 위한 세션 id
를 만들고 브라우저한테 보내줄거다.
알아서 처리 되는거다. 그러면 브라우저가 쿠키에 그 세션 id
를 저장하고
express
에서도 그 세션을 세션 DB
에 저장 할거다. 세션 DB
에 있는 id
와 쿠키에
있는 id
가 같도록 말이다. 그러면 브라우저한테 보내서 쿠키에 저장한 세션 id
를
브라우저가 localhost:4000
의 모든 url
에 요청을 보낼 때마다 세션 id
를 요청과 함께 보낼거다.
그러면 백엔드에서 어떤 유저가 어떤 브라우저에서 요청을 보냈는지 알수 있는거다.
예를 들어 , 집에 오는 사람들한테 id
카드를 주는거랑 비슷하다.
얼굴을 계속 잊어 먹을테니까 집에 올때마다 id
카드를 보여줘야 한다.
마스크를 쓰고 있으면 까먹을 수도 있으니깐 말이다.
그래도 그 사람들이 마스크를 쓰고 꾸민채로 온다고 가정 해본다.
어쨋든 누가 들어오는건지는 알아야 하니깐 id
카드를 주는거다. 그리고 다음에도 집에 오고 싶다면
id
카드를 들고 오라고 알려주는 거다. 어떻게 꾸미고 왔는지 마스크를 쓰고 왔는지
그런 것들과 상관없이 말이다. id
카드를 들고 왔으니 말이다.
id
카드를 들고오면 만든 id DB
에서 이름을 찾고 그 사람의 이름으로 인사를 할수 있다.
지금 브라우저에서 하고 있는게 이거이다.
브라우저한테 백엔드 url
을 방문할때 마다 보여줘야하는 id
카드를 주는거다.
쿠키가 이런 일처리를 해주기 때문에 좋은거다. 유저들은 아무것도 할게 없는거다.
유저한테 쿠키를 주면 유저가 웹사이트를 방문할때 마다 알아서 그 쿠키를 보내주니까
지금까지 봤다시피 유저를 구분하는건 정말 좋은거다.
예를 들어 브라우저에서 potato
가 30이라는걸 기억하고 다른 브라우저에서는 potato
가
8이라는걸 알수 있다. 이 모든건 세션 , 세션id
때문에 가능한거다.
이 id
를 브라우저한테 보내주고 브라우저가 요청을 할때마다 id
를 같이 보내준다.
Author And Source
이 문제에 관하여(Sessions and Cookies #02), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@0_cyberlover_0/Sessions-and-Cookies-02저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)