쾌락코딩

쿠키 vs 세션

|

쿠키와 세션은 왜 필요한가?

쿠키와 세션이 왜 필요한지, 무엇 때문에 등장했는 지를 알기 위해선 우리가 사용하는 웹, http 프로토콜이 비연결성을 띄며 Stateless하다는 것을 이해해야 한다. 이것들의 단점을 보완하기 위해 쿠키와 세션이 등장했기 때문이다.

비연결성

http는 요청과 응답을 주고 받을 때 지속적으로 연결 되어있지 않다. 즉 클라이언트가 서버로 request를 날리고, 서버가 클라이언트에게 response로 응답을 주면 이후 그 둘은 서로 모르는 사이가 된다. 서로 자기가 할 역할에만 충실할 뿐 서로에게 관심이 없다는 뜻이다. cookie1 이 과정이 한차례 지나가면, cookie2 이렇게 서로 모르는 사이, 서로 접속이 끊어진 사이가 되는 것이다.

stateless

사실 statelss한 것은 비연결성과 밀접한 관계이다. 클라이언트와 서버의 통신이 한 번 이루어지고 끝이나면 서버는 데이터를 저장하지 않는다는 것을 의미한다. 상태가 없다는 뜻에서 stateless라고 한다. HTTP 프로토콜은 요청 간 사용자 데이터를 저장하는 수단을 제공하지 않는다.

그러나 상태를 저장하지 않는다고 해서 매번 클라이언트가 요청 할 때 마다 새로 로그인을 하는 건 너무 비효율적인 일이 될 것이다. 그것을 해결하기 위해 쿠키와 세션이 등장했다.

결론부터 말하자면 쿠키는 클라이언트에서 저장되는 데이터인데, 쿠키에 로그인 정보를 저장해 놓으면 매번 request요청시 쿠키도 자동으로 전송되어 로그인이 끊기지 않은 것 처럼 느낄 수 있다. 세션은 뒤에서 더 자세히 알아보겠다.

쿠키(COOKIE)

쿠키는 클라이언트 로컬에 저장되는 데이터 문자열이다. 이 쿠키 데이터는 아주 작은 데이터로 파일에 저장되는데 브라우저별로 저장되는 위치가 다르다. 위치는 여기에서 참조했다. cookie3

위와 같은 경로에 쿠키가 저장되는데 쿠키에 저장되는 정보는 대표적으로 쿠키 이름, 값, 만료 날짜(쿠키 저장 기간), Domain, 경로 정보 등이 있고, 몇 가지 사례를 들자면 특정 웹사이트나 웹페이지에 얼마나 자주 또는 몇 번 방문했는지, 또는 팝업에서 “오늘 더 이상 이 창을 보지 않음” 체크 상태 등 서버가 어떤 주기동안 클라이언트의 상태를 알아줬으면 하는 데이터를 저장한다.

위에서 domian은 굵은 글씨로 작성했는데, 도메인에 적힌 곳에 반복 요청을 할 경우 자동으로 쿠키가 전송된다. 만약 그렇지 않다면 naver에 request를 보낼 때도, 구글에 어떤 requeset를 보낼 때도 같은 로그인 정보를 전송하게 될테니 domain은 꼭 필요한 것이다.

쿠키는 Request요청시 COOKIE라는 Header에 값이 설정되어 함께 보내진다.

쿠키의 단점

쿠키는 브라우저에 저장되는 값이기 때문에 보안에 취약하다. 또한 하나의 도메인에서 설정한 쿠키 값이 20개를 초과하면 가장 적게 사용된 쿠키부터 지워진다.

세션(SESSION)

흔히들 쿠키는 클라이언트에, 세션은 서버에 저장되는 데이터라고 말한다. 그러나 enterkey님의 블로그에 따르면 특정 프레임워크에서는 세션을 쿠키에 저장한다고도 한다. 그래서 서버에 데이터를 저장한다기 보다 서버에서 클라이언트의 상태를 유지하는 수단이라는 말이 좀 더 맞다고 이야기한다(세션을 쿠키에 저장하는 것의 장점은 잘 모르겠다..). 아무튼 나는 “일정 시간동안 같은 사용자(같은 브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 서버에 유지시키는 기술” 이라는 정의를 좋아한다.

클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트마다 고유한 id를 부여하고 저장하는데, 이 id가 세션 id이다. 이렇게 하면, 클라이언트의 민감한 데이터를 굳이 쿠키에 저장할 필요가 없이, 쿠키에는 세션id만 등록해놓고, request시 세션id를 서버로 보내면 서버가 세션 id를 기준으로 데이터를 찾아서 읽으면 그만이다. 결국 비연결성, statless한 http의 단점을 보완하고자 하는 목적에서 쿠키와 세션의 역할을 동일하다고 볼 수 있다.

세션의 저장은?

쿠키는 브라우저별로 파일을 만들어 저장했다. 그럼 세션은 어떻게 저장할까? 그것은 서버 엔지니어의 마음대로이다. 메모리에 저장할 수도, 파일에 저장할 수도, db에 저장할 수도 있다. 그러나 부하분산을 위해 한 도메인에 여러대의 서버를 운영하고 있다면, 메모리나 파일을 사용하면 안되고 데이터베이스나 쿠키를 사용해야 한다(개인적으로 데이터베이스 추천! 쿠키는 보안에 취약하니깐).

그렇다면 쿠키의 만료기간은 쿠키에 명시되어 있는데, 세션의 만료기간은 어떻게 될까? 세션을 db에 저장한다면, DB_SESSION관련 라이브러리를 사용할 경우 해당 라이브러리가 알아서 관리해주고 그렇지 않다면 서버 개발자가 직접 설정해주게 된다.

세션에서 쿠키로 id 전송

위에서 설명했듯이 쿠키에는 session id만 저장하면 된다. 그러기 위해서는 우선 서버에서 세션을 생성한 후 세션 id를 쿠키에 알려줘야 한다. 이때는 Set-Cookie헤더에 seesion_id를 담아서 response와 함께 전달한다.

세션의 단점

세션은 서버의 자원을 사용하기 때문에 미세하더라도 서버에 부하를 준다. 때문에 속도가 느려질 수도 있다.

참고

Comments