Cookie와 Session 차이
Cookie와 Session
Cookie와 Session은 HTTP 프로토콜의 stateless 특성으로 인해 그 약점을 보완하기 위해 존재한다. HTTP 프로토콜은 상태를 저장할 수 없는데 그렇다는 것은 클라이언트가 request를 보냈을 때 서버는 해당 request 에 대해 응답를 보내준 후 연결을 끊는다는 말이다. 이러한 상황에서 그 약점을 보안하기 위해 몇 가지 방법이 있는데, 이게 바로 우리가 쉽게 접할 수 있는 query string, cookie, session, database, localstorage, indexedDB 등이 있다. 물론 이러한 방식도 저장하는 곳이 클라이언트냐 서버냐에 따라 나뉘어 질 수 있다.
Cookie란 무엇인가
일단 먼저 쿠키에 대해 간략하게나마 이해할 수 있도록 아래의 동영상을 보도록 하자.
쿠키는 서버에서 클라이언트의 PC에 설치하는 작은 기록 정보라고 생각하면 된다. 이 기록 파일에 담긴 정보는 클라이언트의 사용자가 그 웹사이트에 접속할 때마다 수시로 새로운 정보로 바뀐다. 이 쿠키란 정말 사용하기 나름인데, 가장 큰 단점으로는 보안에 취약하다는 것이다. 잘못 사용할 시에는 사용자의 웹 계정 접근 권한을 획득할 수 있어, 악용의 우려 또한 존재한다. 요즘처럼 개인 정보 보안이 중요해진 시점에서는 더더욱이나 사용자의 중요한 정보 이러한 쿠키를 이용하는 것은 정말 위험한 행동이다. 이러한 쿠키를 사용하는 경우에는 예를 들어 오늘 하루 다시 보지 않음와 같은 만료 날짜에 대한 데이터 혹은 쇼핑몰에서의 장바구니와 같은 정보 등에서 활용할 수 있다. 그 뿐만 아니라 동영상에서 나온 것과 같이 자그마한 리소스 요청만으로도 해당 사용자가 어느 사이트에 방문을 했었는지, 어떠한 검색어를 이용했는지 등의 정보를 취득할 수도 있다.
쿠키는 클라이언트에 총 300개까지 저장할 수 있으며 하나의 도메인당 최대 20개, 4096Byte까지만 저장이 가능하다. 만약 하나의 도메인당 20개의 갯수를 초과하게 될 시에는 오래된 쿠키의 정보를 덮어쓴다. 하지만.. 저 사실 이렇게까지 쿠키에다가 많은 양의 쿠키를 담아가며 개발을 한적이 없어, 이러한 점들은 크게 신경을 별로 안쓰기도 하였으며, 만약 클라이언트 스토리지에 단순한 데이터 외에 JSON 형태의 데이터를 저장해야한다고 하면 오히려 LocalStorage 를 이용하여 저장했던 것 같다.. 각설하고 이러한 쿠키에는 다음과 같은 필드를 포함하고 있다.
필드 이름 | 설명 |
---|---|
Name | 해당 쿠키의 이름 |
Value | 해당 쿠키의 값 |
Domain | 해당 쿠키의 스코프를 정의(쿠키가 전송될 호스트를 명시) |
Path | 해당 쿠키를 전송하기 위한 URL 경로 |
Expires/ Max-Age | 쿠키의 만료일(만료된 쿠키는 더이상 브라우저에서 보내지 않는다.) |
Size | 사이즈 |
HttpOnly | Javascript 상에서는 접근할 수 없도록 제한하는 경우 설정(서버에게 전송되기만 함) |
Secure | HTTPS 프로토콜 상에서 암호화된 요청일 경우에만 전송 |
SameSite | 같은 사이트 |
Session 이란 무엇인가
Session 이란 사용자의 인증에 대한 Key로서 서버에 request를 요청한 클라이언트를 식별할 수 있는 방법 중 하나이다. 이 key의 경우에는 실제 사용자의 데이터를 담고 있는 것이 아니라, 클라이언트를 식별할 수 있는 고유한 key
, 말 그대로 Session 정보만 넘겨준다 라고 생각하면 된다. 그래서 Session은 Cookie 보다는 더 보안적으로는 안전하다고 생각하면 된다.
Session과 Cookie
둘은 사실 뗄레야 뗄 수 없는 관계인 것 같다. 사용자의 인증이 들어가지 않는 경우에는 Cookie만 사용해서 간단한 정보 등을 저장할 수 있지만, 사용자의 인증이 들어가는 순간부터는 Session없이는 Cookie를 사용할 수 없다. 정리를 하자면 Cookie의 경우 서버에 저장되어야 할 정보를 모두 클라이언트에게 제공을 해주는 형태라고 보면 된다. 이러한 점은 서버의 자원을 사용하지 않아 서버에 과부하를 줄여준다는 장점이 있다. 하지만 위에서 말했듯이 모든 사용자에게 Cookie를 노출될 수 있어 보안 취약점이라는 문제를 안고 있다. 반대로 Session의 경우는 Cookie와는 다르다. Session은 클라이언트 메모리에 저장하는 것이 아닌 서버에 저장을 하고, 고유의 key를 클라리언트에게 전달을 해준다. 그리고 클라이언트는 그 key를 클라이언트 메모리 ( localstorage, cookie ) 등에 저장한다. 그 후 클라이언트에서 뭔가의 request를 보낼 때 그 key를 다시 서버로 보내 그 사용자에 대한 인증은 서버에서 이뤄진 후 response를 보낸다. Session은 Cookie와 달리 서버에서 처리를 하기 때문에 그 속도는 Cookie 보다는 느리다고 할 수 있다.