쿠키와 세션의 차이

HTTP/1.1 프로토콜은 기본적으로 상태를 가지지 않습니다(stateless). 하지만 로그인 정보, 장바구니 등과 같이 정보를 저장해 놓는(stateful) 웹 페이지는 많이 존재합니다.

이런 정보를 저장하기 위해 클라이언트와 서버는 쿠키(Cookie)와 세션(Session)을 이용해 사용자를 구분하고 정보를 저장하는데, 조금 헷깔리기도 합니다.

이 글에서는 웹에서 사용자의 상태를 관리해주는, 쿠키와 세션의 차이를 확인하도록 하겠습니다.

쿠키는 웹 브라우저가 사용자의 PC에 쿠키를 텍스트 형식으로 저장해놓고, 도메인에 맞는 서버에 보내주게 됩니다. 서버는 웹 브라우저(사용자)가 전송한 쿠키를 읽어서 페이지를 렌더링하고, 사용자에 맞는 페이지를 보여줍니다.

사용자와 서버 간에는 아래와 같은 흐름을 가집니다. 1. (사용자->서버) 사용자는 서버에게 특정한 요청을 한다. (로그인과 같은) 2. (서버->사용자) 서버는 특정한 요청에 대해 정보를 담은 쿠키를 사용자에게 전송한다. 3. (사용자) 사용자는 전달받은 쿠키를 디스크에 기록한다. 4. (사용자->서버) 또다른 요청을 서버에 보낸다. 이 때 쿠키를 함께 보낸다. 5. (서버->사용자) 서버는 사용자가 전달한 쿠키를 읽어 적절한 페이지를 렌더링하여 사용자에게 보낸다.

위와 같이 서버와 사용자 간의 통신에 쿠키가 오가게 됩니다. 즉 정보는 쿠키 안에 저장되게 됩니다.

쿠키 안에 저장된다는 것은 큰 보안 문제가 있다는 말과 같습니다. 쿠키는 암호화되지 않은 텍스트 형식으로 저장되기 때문에, 허용되지 않은 사용자가 쿠키의 내용을 읽거나 수정할 수 있습니다.

예를들어 로그인 정보를 쿠키에 저장한다고 생각해보겠습니다(옛날에 실제로 쿠키에 로그인 정보를 저장했습니다). 일반적으로 로그인 정보는 ID와 패스워드로 이뤄집니다. 이 때 두 가지를 가정해볼 수 있습니다. 1. ID만을 쿠키에 저장한다. 2. ID와 패스워드 모두를 쿠키에 저장한다.

1의 경우 ID만을 저장하기에 로그인에 관련된 정보를 모두 탈취당할 일이 없습니다. 하지만 ID를 쿠키에 임의로 기록하는 방식으로 공격이 가능합니다.

2의 경우 ID와 패스워드 모두를 기록합니다. 이경우 1과 같은 문제는 생기지 않지만 ID와 패스워드가 모두 탈취당하는 문제가 생깁니다.

위의 두 경우는 극단적인 보안 문제지만, 쿠키에 어떤 문제가 있는지 간단히 확인할 수 있습니다.

또 다른 문제가 있다면 쿠키에 정보를 많이 저장할 경우 요청이 느려진다는 겁니다. 쿠키는 저장된 도메인에 대해 요청을 전송할 때마다 모든 쿠키를 전송해버리기 때문에, 내용이 많아지면 요청 속도 저하를 불러옵니다.

세션(Session)에 대해서

위에서 쿠키에 대해 안 좋게 써놓았지만, 사실 세션은 쿠키를 이용해 구현됩니다.

세션에 대해 설명하기 전에 세션이 어떻게 동작하는지 알아보겠습니다. 1. (사용자->서버) 사용자는 서버에게 페이지를 요청합니다. 2. (서버->사용자) 서버는 세션을 생성하고, 세션을 식별할 ID를 쿠키에 넣어 페이지와 함께 사용자에게 전달합니다. 3. (사용자->서버) 사용자는 서버에게 특정한 요청을 합니다. 4. (서버->사용자) 사용자에게서 전송된 세션 ID로 세션에 정보를 넣습니다. 사용자에게 필요한 정보가 렌더링 된 페이지를 전송합니다.

이 흐름에서 사용자의 정보가 어디에 저장되는지 확인할 수 있습니다. 세션에서 사용자의 정보는 서버 안에 저장됩니다. 쿠키와 같이 사용자의 ID와 패스워드가 저장된 쿠키로 인해 노출될 가능성은 없어졌습니다.

사실 세션은 이게 전부라고 봐도 무방합니다. 서버에 저장되고, 쿠키를 통해 ID를 식별하는게 끝입니다.

하지만 위의 쿠키(Cookie)에 대해서를 보면 저는 쿠키에 대해 좋지 않게 서술하였습니다. 이는 다음과 같은 이유 때문입니다.

사용자 정보 저장 주체가 쿠키에서는 쿠키 내부(클라이언트), 세션에서는 서버 내부이다.

즉, 쿠키를 사용하게 되면 사용자의 주요 정보가 탈취될 위험을 높이게 됩니다.

결론

쿠키에는 중요하지 않은 정보만 저장하고, 그 외의 정보는 세션에 저장해서 사용해야 합니다.

아래는 쿠키와 세션을 표로 정리한 것입니다.

구분 쿠키 세션
사용자 식별 방법 쿠키 안의 정보를 확인 쿠키로 전송된 세션 ID로 세션 정보를 확인
정보가 저장되는 위치 (쿠키 내부) 클라이언트 서버
보안 비교적 취약 비교적 안전
처리 부담 클라이언트, 서버 모두 조금씩 서버가 대부분

HTTP/1.1, 쿠키, 세션에 관한 정보는 다음 RFC에서 확인할 수 있습니다.

참고

Flask를 reverse proxy 서버로 사용하기 Python3에서 함수의 인자 다루기
comments powered by Disqus