Study/cs (computer science)

쿠키 2부 : 세션은 쿠키가 필요하다

개발하는 주디씨 2023. 11. 30. 11:51

 

사용자 인증을 할 때, 쿠키를 사용하면 위험해요.
서버에 데이터를 저장할 때는 세션으로 하는 것이 안전합니다.

 

실무에서 로그인 및 회원가입은 가장 시작이자 기본이 되면서 중요한 역할을 한다고 볼 수 있습니다. 그 가운데 사용자 인증은 서비스에서 가장 중요하다고 할 수 있는데요!! 위 말은 맞는 말일까요?

 

많은 사람들이 쿠키와 세션을 서로 대립하거나 세션이 쿠키를 대신하는 기술로 오해하는 것 같습니다ㅠㅠ이번 포스팅은 쿠키와 세션에 대한 오해를 풀고 쿠키를 사용할 수 밖에 없는 이유와 세션을 통한 사용자 인증은 어떻게 하는지 알아보겠습니다!!

 

 

(지난 내용과 이어지는 내용이니 아직 못보셨다면 다녀오세요😆)

https://printf-hellojudyworld.tistory.com/84#comment15268315

 

쿠키 1부 : HTTP로 설명하는 쿠키

쿠키는 클라이언트에 저장되고… 음.. 보안에 좋지 않습니다. - 그럼 보안을 위해서 쿠키는 안 쓰는 게 좋겠네요? 쿠키가 어떻게 서버와 브라우저 간에 이동을 하는지, 그리고 쿠키의 유효 기간

printf-hellojudyworld.tistory.com

 

쿠키(Cookie)와 세션(Session)은 상호보완하는 기술

쿠키와 세션을 잘 이해하기 위해서는 우선 웹에 대해 알아야합니다. 웹에 대해 생각해볼까요? 웹은 HTTP 프로토콜로 통신하고 그 특징을 생각하자면 무연결(Connectionless)과 무상태(Stateless) 라는 것을 이해해야합니다. 서버는 클라이언트의 요청에 응답을 하는 순간 HTTP 통신을 종료하게 되며, 클라이언트에서 새로운 요청 시에 HTTP 연결이 맺어집니다.

물론 사용자 입장에서는 브라우저만 보고 있기 때문에 서버와 연결이 끊어졌다는 것을 체감할 순 없지만, 문제는 프로그램의 관점에서 생각해보면 애플리케이션을 구현하는데 큰 걸림돌이 됩니다. 서비스는 여러 페이지에 걸쳐 하나의 흐름으로 이어져야 하는데 이러한 무연결성이 서비스를 구현하기 어렵게 하기 때문입니다.

클라이언트와 서버가 연결이 유지되지 않는 상황에서 서버로 많은 요청이 들어왔을 때 이 클라이언트가 처음 요청한 것인지 이전에 요청했던 것을 재요청한 것인지 알 수 없는 일이기 때문에 서버는 처음처럼 계속 요청을 처리해줄 수 밖에 없습니다.

 

이렇게 되면 낭비가 되고, 힘들어지겠죠?

 

 

여기서 쿠키🍪(Cookie)의 지속성이 빛을 발휘할 수 있습니다✨

서버가 쿠키를 한 번 브라우저에 저장하면 브라우저는 쿠키를 매 요청마다 서버로 전달할 수 있게 됩니다. 쿠키를 통해 데이터가 지속될 수 있도록 할 수 있는 것이죠!! 이러한 쿠키의 특성은 단순히 지속성에서 그치지 않고 트래픽 분산도 할 수 있습니다 :)

 

트래픽 분산(Load Balancing)을 위한 쿠키활용법

트래픽 분산.. 별거 없어요. 좀 있어보이는 말로 설명하면 이게 로드밸런싱이란 것이죠ㅎ.ㅎ

수 많은 사용자로부터 동시에 들어오는 요청을 처리하려면 일반적으로 여러 대의 서버를 운영하여 분산시키는 방법을 사용하게 됩니다. 서버 앞 단에 로드 밸런서(Load Balancer)를 두고 부하가 여러 대의 서버로 분산될 수 있도록 인프라를 구성하는 이유이죠.

 

그런데, 이런 환경에서 로드밸런서가 요청을 순차적(라운드로빈)으로 혹은 랜덤하게 서버에 배정하게 된다면 어떨까요?

A서버에서 로그인 되어 세션을 가진 사용자가, 다음 요청 때 B번 서버에 요청하게 된다면 이 사용자는 로그인이 되었을까요? 아닙니다❌ B서버에는 해당 사용자의 세션정보가 존재하지 않기 때문에 로그인 된 사용자라고 인지하지 못할 겁니다. 이렇게되면.. 서버마다 재로그인을 세션을 유지하지 못하고 계~속 처리를 해야하는 이슈가 발생할 것입니다.

 

이런 경우 쿠키를 활용하면 사용자를 고려할 수 있으니 어떤 방법인지 알아봅시다.

사용자가 서비스에 최초 접속했을 때 그 요청을 처리한 서버가 자신의 식별자를 쿠키로 지정하라고 브라우저에 전달하면, 해당 브라우저는 사용자가 해당 사이트의 어느 페이지에 방문하던 그 저장된 쿠키를 돌려보내게 됩니다. 그럼 로드 밸런서는 서버 식별자를 보고 이 브라우저에서 오는 요청을 식별자에 해당하는 서버로 보내줄 수 있습니다. 이렇게 되면, 쿠키를 통해 어떤 서버에서 인증된 세션인지를 알고 해당 세션이 있는 서버에 접근하여 로그인을 시도했던 사용자인지 확인할 수 있게 됩니다😆

 

세션기반 사용자 인증

이렇게만 보면 쿠키가 장점밖에 없는 것 같을 수 있지만, 사실 쿠키는 브라우저에 저장된다는 최대 단점을 가지고 있습니다. 따라서 이 문제를 보완하기 위해 서버 측에서 관리하는 세션을 활용해볼 수 있습니다. (세션과 쿠키는 엄연히 장단점과 차이가 있으며 뭐가 맞고 틀리다고 말할 수 없습니다. 적재적소에 맞게 잘 활용하는 것이 BEST라는 것을 잊지마세요!!)

잘못된 시나리오를 먼저 생각해보면 사용자 ID, PW를 브라우저 쿠키에 담아 요청이 있을 때마다 서버에 전달하는 방법을 생각할 수 있습니다. 그러나, 이 방법은 1차적으로 해결이 될 수는 있으나 보안문제는 물론 서버는 단순히 DB에서 해당 사용자의 세션을 검색하는 역할만 하게 됩니다...

 

안전하게 사용자의 상태를 유지하는 방법은 어떤게 있을까요? 사용자가 입력한 인증 정보를 세션으로 저장한 뒤 이를 활용하면 됩니다!

사용자가 브라우저에서 로그인 페이지를 열고 인증정보를 요청하면 서버는 사용자DB를 조회 후 인증정보를 검증하여 서버에 세션을 생성해줍니다. 그 후 서버의 세션을 식별할 수 있는 식별자 = 세션ID 를 쿠키로 브라우저에 응답을 해주면 브라우저는 매번 요청을 보낼 때 이 세션 아이디가 담긴 쿠키를 서버에 전달할 수 있게 됩니다.

서버는 이 세션 아이디에 해당하는 세션이 존재하는지만 확인해주면 훨씬 더 간단하고 단순하지만 실제 인증정보는 숨겨진 채로 로그인 인증을 처리할 수 있게 됩니다.

 

마치며

아는 만큼 보이고, 아는 만큼 잘 활용할 수 있다는 말은 어디에나 공통인 것 같습니다✨포스팅에서는 브라우저가 쿠키를 지속적으로 서버로 보낼 수 있다는 특성을 활용했지만 이 밖에도 쿠키는 많은 역할과 단점 또한 존재합니다. 따라서 쿠키와 세션을 활용하려고 한다면 관심을 갖고 더 깊이 공부해보시는 것을 추천합니다 :) 막연하게 쿠키와 세션에 대해 생각했던 내용을 정리하고자 적어 본 내용이니 틀린 내용이나 다른 내용이 있다면 언제든 댓글 남겨주세요!! 

 

끝.