본문 바로가기

Computer Science/네트워크

[Web] 쿠키(Cookie)와 세션(Session)

[HTTP의 특징과 쿠키와 세션을 사용하는 이유]

서버와 클라이언트가 통신할 때마다 서버는 클라이언트가 누구인지 인증을 계속 해야 한다. 그 이유는 HTTP 프로토콜의 Connectionless, Stateless한 특성 때문이다.

 

  • Connectionless

    클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징이다.

    • HTTP 1.1 버전에서는 커넥션을 계속 유지하고 요청(request)에 재활용하는 기능이 추가되었다. -> HTTP Header에 keep-alive 옵션을 주어 커넥션을 재활용한다. HTTP 1.1 버전에서는 디폴트 옵션이다.
    • HTTP가 TCP 위에서 구현되었기 때문에 (TCP는 연결 지향, UDP는 비연결 지향) 연결 지향적이라고 생각할 수 있겠지만, 아직까지 네트워크 관점에서는 keep-alive는 옵션으로 두고, 서버 측에서 비연결 지향적인 특징으로 커넥션 관리에 대한 비용을 줄이는 것이 명확한 장점으로 본다고 한다.
  • Stateless

    커넥션을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보를 유지하지 않는 특징이다.

 

이러한 비연결성의 장점은 무엇일까? HTTP는 인터넷 상에서 불특정 다수의 통신 환경을 기반으로 설계되었다. 만약 서버에서 다수의 클라이언트와 연결을 계속 유지해야 한다면, 이에 따른 많은 리소스가 발생하게 된다. 따라서, 위에서 말했듯이 연결을 유지하기 위한 리소스를 줄임으로써 더 많은 연결을 할 수 있으므로 비연결적인 특징을 갖는다.

 

하지만, 서버는 클라이언트를 기억하고 있지 않으므로 동일한 클라이언트의 모든 요청에 대해, 매번 새로운 연결을 시도/해제하는 과정을 거쳐야 하기 때문에 연결/해제에 대한 오버헤드가 발생한다는 단점이 있다.

 

쿠키와 세션은 이러한 단점을 해결하기 위해, 즉 클라이언트의 인증을 유지하기 위해 사용한다. 예를 들어, 쿠키와 세션을 사용하지 않으면 쇼핑몰에서 옷을 구매하려고 최초 로그인을 했음에도, 페이지를 이동할 때마다 계속 로그인을 해야 하는 것이다.

 

쿠키와 세션을 사용했을 경우에는 최초 로그인을 하면 어떠한 방식에 의해서 서버가 그 사용자에 대한 인증을 유지하게 된다. 즉, 쿠키와 세션을 통해 서버는 클라이언트를 기억하고 있는 것이다.

 

 

[쿠키 (Cookie)]

쿠키는 클라이언트 측(브라우저)에서 저장되고 관리되는 작은 기록 정보 파일을 의미한다. 쿠키에는 사용자 인증이 유효한 시간을 명시할 수 있고, 한 번 유효 시간이 정해지면 브라우저를 끄더라도 인증이 유지된다.

 

쿠키 구성 요소

  • 이름: 각각의 쿠키를 구별하는데 사용되는 이름
  • 값: 쿠키가 갖고 있는 값
  • 유효 시간: 쿠키의 유지 시간
  • 도메인: 쿠키를 전송할 도메인
  • 경로: 쿠키를 전송할 요청 경로

쿠키 동작 방식

  1. 클라이언트가 페이지를 요청한다.
  2. 서버에서 쿠키를 생성하고 HTTP Header에 쿠키를 포함시켜 응답한다.
  3. 브라우저가 종료되어도 쿠키 만료 시간이 있다면 클라이언트에서 보관하고 있는다.
  4. 클라이언트가 재요청 시 웹 페이지 요청과 함께 쿠키값도 전송한다.
  5. 서버에서 쿠키를 읽고 지속적인 로그인 정보를 갖고 있는 것처럼 사용한다. 만약 이전 상태 정보를 변경할 필요가 있을 경우, 쿠키를 업데이트하여 변경된 쿠키를 HTTP Header에 포함시켜 응답한다.

쿠키의 제한

  • 클라이언트에 300개의 쿠키를 저장할 수 있다.
  • 하나의 도메인 당 20개의 값과 각각 4KB까지 저장할 수 있다.
  • Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들 수 있다.
  • 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request 시에 Request Header를 넣어서 자동으로 서버에 전송한다.

쿠키 사용 예

  • 자동 로그인
  • 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크
  • 쇼핑몰 장바구니

 

[세션 (Session)]

쿠키는 사용자 정보가 브라우저에 저장되기 때문에 공격자로부터 위변조의 가능성이 높아 보안에 취약하다. 이와 달리 세션은 브라우저가 아닌 서버단에서 사용자 정보를 저장하기 때문에 쿠키보다 비교적 안전하다고 할 수 있다.

세션은 일정 시간동안 같은 브라우저로부터 들어오는 요구를 하나의 상태로 보고 그 상태를 유지하는 기술이다. 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리, 세션은 서버 측에서 관리된다. 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증 상태를 유지한다.

 

세션 동작 방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급한다.
  2. 클라이언트는 세션 ID에 대해 쿠키를 사용해서 저장한다. 이 때의 쿠키의 이름은 JSESSIONID이다.
  3. 클라이언트가 서버에 다시 접속 시 이 쿠키를 이용해서 세션 ID 값을 서버에 전달한다.

쿠키 사용 예

  • 로그인 정보 유지

 

[쿠키와 세션의 차이]

세션도 결국 쿠키를 사용하기 때문에 둘은 비슷한 역할을 하고 동작 원리도 비슷하다.

가장 큰 차이점은 사용자의 기록 정보가 저장되는 위치이다. 때문에 쿠키는 서버의 자원을 전혀 사용하지 않고, 세션은 서버의 자원을 사용한다.

또한, 보안면에서도 비교적 세션이 더 우수하다. 요청 속도는 쿠키가 세션보다 더 빠른데, 그 이유는 세션의 경우 서버에서의 처리가 필요하기 때문이다.

 

 

 

 

 

 

Reference

https://goodgid.github.io/Cookie-vs-Session/

https://victorydntmd.tistory.com/34?category=719464