(19) 세션 vs 토큰 vs 쿠키? 기초개념 잡아드림. 10분 순삭! - YouTube
은근히 헷갈려하는 것들 중에 포함 되는 것이 바로 이 쿠키(Cookie), 세션(Session), 토큰(Token), JWT(조트 or 제이더블유티)이다.
처음 코딩을 시작하는 분들이라면 아직까지는 알 필요 없을 수도 있지만, 이제 1년차가 되어가는 분들, 그리고 취준생분들이라면 그 개념을 확실히 해놔야 지금 당장 사용하지 않더라도 대화를 알아들을 수 있고 이해할 수 있을 것이라고 생각한다.
... ... ...
1. 쿠키 (Cookie)
우선 쿠키(Cookie)에 대해서 알아보자.
쿠키라는 것을 이용해서 서버는 내가 찾은 정보 등의 데이터를 나의 브라우저에 넣을 수 있다.
우리는 흔히 어떠한 사이트에 방문하고, 검색하는 식으로 이용하게 된다.
이러한 정보들이 바로 쿠키라는 곳에 저장되는 것이다.
여러분들은 아마 아래와 같은 이미지를 본 적이 있을 것이다.
이는 크롬을 이용하는 분들의 경우 방문기록을 삭제를 하려고 하면 볼 수 있는 것인데, 중간에 보면 "쿠키 및 기타 사이트 데이터"를 삭제 할 수 부분이 있다.
그 말은 즉, 쿠키는 내 정보를 마음대로 삭제도 가능하다는 뜻이다.
또한 그런만큼 남들이 훔쳐보거나 할 수도 있다고 할 수 있다. 또한 유효기간(expired date)이 정해져있다.
그러니 중요한 정보를 담아서는 안 된다.
어떤 정보들을 쿠키에 담아야할까?
가령, 어떤 사이트의 언어를 바꾼다던지, 쇼핑몰 페이지에서 카트에 넣어두기 등 보안과 큰 관련이 없는 경우 사용 할 수 있다.
2. 세션 (Session)
세션은 쿠키에 저장하기 곤란한 것들 즉, 로그인 정보 같은 것들을 저장하기 용이하다.
세션은 Session database를 말하는데, client가 아이디와 비밀번호를 쳐서 request를 보내면 서버에서는 session database로 그 정보를 보낸다.
Session에서는 각각의 유니크한 ID를 가지고 있는데, 이 Unique ID를 서버로 보내고 서버는 Client가 원하는 정보와 함께 그 ID를 쿠키에 싣어서 Client로 보내게 된다.
앞서 쿠키에 대해서 살펴 봤지만, 쿠키는 "어떤 것" 이라기 보다는 이동시켜주는 "매개체" 정도로 볼 수도 있겠다.
그러니 아래와 같은 그림으로 볼 수 있을 것이다.
이렇게 되면 Client는 오직 session database에서 발급해주는 unique ID만 가지고 있게 되고, 이 후에도 이 unique ID만 비교해보고 확인해서 응답을 보내줄 수 있을 것이다.
그렇다면 보안성이 더 좋은 Session에 모든 것들을 저장하면 되지 않을까?
결론은 Cookie와 Session 둘 중 하나만 선택하기 보다는 둘다 사용하는 것을 생각해봐야할 것이다.
세션을 사용한다는 것은 로그인 한 모든 유저들의 모든 세션ID를 Session DB에 저장해야한다는 뜻이다.
그런만큼 서버는 쿠키에 들어있는 세션 ID를 보고 일치하는 것을 매번 찾아야한다.
유저가 소수 일 때는 괜찮지만 늘어나게 되면 DB 리소스가 더 필요하다는 것이다.
유저가 늘어남에 따라 DB를 더 사고 유지 해야하며, 그만큼 비용도 들어가게 될 것이다.
3. 토큰 (Token)
토큰은 사실 간단하게 보면 string 이라고 할 수 있다.
토큰을 사용하는 이유가 무엇일까?
크게 봤을 때 웹 개발과 앱 개발로 나눠볼 수 있을 것이다.
그런데 웹에는 "쿠키"가 있는데, 앱에는 쿠키가 없다.
즉, 앱을 개발해야하는 경우 Token을 사용해 볼 수 있을 것이다.
Server에서는 Session DB에서 Client가 보낸 토큰과 일치하는 유저를 찾게 되는 것이다.
4. JWT
JWT는 아래와 같이 생겼다.
(참고 : jwt.io)
보다시피 엄청 길다.
그리고 더 길게 만들 수도 있다.
쿠키의 경우 공간 제약이 있지만 JWT를 그렇지 않기 때문에 충분히 길게 만들어서 보안을 강력하게 가져갈 수 있다는 장점이 있다.
JWT는 필요한 정보를 토큰 형식으로 가져와서 처리를 하게 되는데, 그렇게 되면 세션 DB를 필요로 하지 않게 된다.
단지 정보를 받아오면 그것을 확인해서 사인 알고리즘을 통해 사인을 하고 다시 전달해주는 것이 전부다.
우리가 정보를 만들게 되면 서버는 토큰을 만들어서 우리에게 전달해주는데 이 후 페이지를 요청하게 되었을 때 서버의 역할은 위의 이미지 같이 긴 Token을 받으면 토큰이 유효한지, 조작 되었는지 등을 체크하게 된다.
DB를 거칠 필요없이 단순히이것이 통과가 되면 유저로써 인증하게 되는 것이다.
그런만큼 서버가 유저 인증을 위해서 많은 일을 하지 않아도 된다는 뜻이다.
그렇다면 JWT도 완전할까?
문제는 이 JWT는 암호화가 되어있지 않다.
그렇기 때문에 비밀정보를 JWT 안에 두면 안될 것이다.
그리고 JWT는 유효기간을 가지고 있으므로 세션처럼 마음대로 강제 로그아웃 등의 행동은 할 수 없다.
그러나 DB 없이 이런 것들을 가능하게 해주는 강력한 도구라고 볼 수 있다.
4. Cache
캐시는 매우 간단하다.
가져오는데 비용이 드는 데이터가 있을 것이다.
이런 것들을 임시로 저장해두고 사용하게 되는 곳을 말한다.
이를테면 고해상도의 이미지와 같은 것들을 매번 처음부터 불러오려고 하면 오래걸리게 될텐데, 캐시에 저장해두고 바로바로 사용하게 되는 것이다.