코드프레소 백엔드 개발자 양성 과정

쿠키와 세션

쿠키와 세션을 이용해 세션 트래킹을 구현해본다.

H Lee
4 min readJan 21, 2020
Image by Pezibear from Pixabay

로그인이나 장바구니에 상품 담기 등의 기능에선 상태의 지속성이 관건이다. 예를 들면, 방금 찜한 상품이 다른 상품을 보고 온 후에도 저장되어 있도록 구현하는 것은 매우 기본적이고도 중요하다. 이를 돕는 쿠키와 세션에 대해 알아보겠다.

세션 트래킹

인터넷상의 통신 규약인 HTTP는 클라이언트와 서버 사이의 한 요청-응답 주기를 마친 후에 통신을 끊는다. 이런 규약을 무상태 프로토콜이라고 한다. 사용자 활동의 유무와 관계 없이 접속한 모든 클라이언트와 통신을 계속 유지하고자 한다면 서버 측에 과부하가 올 것이다. HTTP에서 응답 완료 후 연결을 단절하는 것은 한정된 서버 자원을 최대한 풀어주는 이점을 지니고 있다.

하지만 이런 특성으로 인해 서로 통신하는 웹 페이지들은 서로 어떤 정보도 공유하지 못하게 된다. 가령 블로그에 글을 작성하고자 글 쓰기 단추를 눌렀을 때, 만약 인터넷이 순수히 HTTP에만 의존하여 작동한다면, 블로그는 사용자가 로그인을 한 상태인지 아닌지 기억하지 못할 것이다. 로그인에 대한 요청과 응답은 이미 이전 페이지에서 독립적으로 이루어졌기 때문이다.

사용자가 온라인에 글을 게시하거나 물품을 주문할 때 한 페이지에서 다음 페이지로 막힘 없이 넘어가려면 필요한 게 세션 트래킹이라는 것이다. 이는 개발자가 웹 페이지 사이에서 상태나 정보가 공유되도록 연결해주는 작업을 말한다. 웹 페이지를 연동하는 방법인 쿠키와 세션에 대해 알아보겠다.

쿠키

쿠키란 웹 페이지들 간에 공유할 정보를 클라이언트의 PC에 저장하여 세션 트래킹을 구현하는 방법이다. 쿠키는 다음과 같은 특징을 지닌다.

  • 정보가 클라이언트의 PC에 저장된다.
  • 저장 용량에 제한이 있다.
  • 사용자가 브라우저에서 쿠키 허용 여부를 설정할 수 있다.
  • 보안에 취약할 수 있다.

C 드라이브를 열고 C:\Users\사용자\AppData\Local\Google\Chrome\User Data\Default\Cache와 같은 경로를 따라가 보면 크롬 브라우저에서 사용되는 쿠키 파일이 사용자의 로컬 PC에 저장되어 있음을 확인할 수 있다.

C:\Users\hlee\AppData\Local\Google\Chrome\User Data\Default\Cache

이렇게 클라이언트의 PC에 정보가 담겨 있으므로 보안에 취약할 수 있다는 단점이 있다. 하지만 쿠키는 사용자의 PC에 정보를 분산 저장함으로써 서버의 부담을 덜어줄 수도 있고, 인터넷 파일 관리에 있어 사용자에게 어느 정도의 통제권을 쥐어준다. 또한 아래에서 보다시피 세션을 이용하기 위해선 쿠키가 필요하다.

자바/스프링에서 쿠키 관련 API로는 아래와 같은 것들이 있다.

  • javax.servlet.http.Cookie
  • HttpServletResponseaddCookie() 메서드로 쿠키를 클라이언트에 저장한다.
  • HttpServletRequestgetCookie() 메서드로 쿠키를 서버로 호출한다.

세션

세션이란 쿠키와 같이 웹 페이지 간 공유할 정보를 저장해 두고 전달해 주는 매개이다. 가장 큰 차이점이라면 세션은 그 정보를 서버의 메모리에 저장한다는 것이다. 세션은 다음과 같은 특징을 지녔다.

  • 정보가 서버의 메모리에 저장된다.
  • 쿠키보다 보안에 유리하다.
  • 세션에 연동하기 위해서는 쿠키를 이용해야 한다.
  • 서버에 부하를 초래할 수 있다.
  • 브라우저 한 개당 한 개의 세션이 생성된다.
  • 유효 시간을 가진다.

세션은 쿠키와 달리 서버 단에 정보를 저장하여 보안 측면에서 월등하다는 장점이 있다. 이런 이유로 웹 페이지에서 로그인 기능처럼 보안이 요구된다면 대부분 세션을 이용한다. 하지만 서버에 있는 세션 정보에 접근하기 위해서는 브라우저가 세션 ID를 할당받아 보관하여야 하며, 이는 쿠키의 형태로 저장된다. 세션이 더 안전하고 저장 용량도 크다고 해서 단순히 쿠키를 사용하지 않을 수 없는 이유이다.

세션 기능에 관련된 자바/스프링 API로는 다음이 있다.

  • HttpSession 클래스로 객체를 생성하여 사용한다.
  • HttpServletRequestgetSession() 메서드로 객체를 생성한다.

getSession() 메서드는 세션 객체가 이미 존재하는지 판별하고, 존재하면 반환하고, 존재하지 않으면 생성하는 등 사용자가 웹 페이지 간의 정보적 분리를 느끼지 않고 매끄럽게 서비스를 이용할 수 있도록 도와준다.

이렇게 로그인, 장바구니 등의 필수 기능을 구현하는 데 빼놓을 수 없는 쿠키와 세션에 대해 살펴보았다.

참고 : 자바 웹을 다루는 기술 (이병승)

--

--