쿠키(Cookie)와 세션(Session)의 차이

YoungBin·2022년 11월 16일
1

HTTP

목록 보기
1/1
post-thumbnail

쿠키/세션을 사용하는 이유

HTTP 프로트콜의 특징이자 약점을 보완하기 위해서 사용한다.

HTTP 프로트콜의 특징

기본적으로 HTTP 프로트콜 환경은 [Connectionless(비 연결성), 무상태 프로트콜(Stateless)] 한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야 한다.

여기서 간단하게 설명하자면

Connectionless(비 연결성)

  • 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끟어 버리는 특징
  • HTTP는 먼저 클라이언트가 requst를 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는 특성이 있다.
  • header에 keep-alive라는 값을 주어서 커넥션을 재활용하는데 HTTP1.1에서는 이 것이 기본이다.
  • HTTP가 TCP위에서 구현되었기 때문에(TCP 연결지향, UDP는 비연결지향) 네트워크 관점에서 keep-alive는 옵션으로
    connectionless의 연결 비용을 줄여주는 것을 장점으로 비연결지향이라고 한다.

무상태 프로트콜(Stateless)

  • 통신이 끝나면 상태를 유지 않는 특징
  • 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지 않는 특성이 있다.

우리는 쿠키외 세션을 무상태 프로트콜(Stateless) 의 2가지 특징을 해경하기 위해 사용한다고 보면 된다.


쿠키(Cookie)

기본적으로 쿠키란 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어가 있는 작은 데이터 파일이다.

  • 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료 되어도 인증이 유지 된다라는 특징을 가지고 있다.
  • 쿠키는 클라이언트 상태 정보를 로컬에 저장했다가 참조한다.
  • 클라이언트에게 최대 300개 까지 쿠키를 저장하게 가능하며, 하나의 도메인이 20개의 값만 가질 수 있다. (4KB 가 최대)
  • Response Header에 Set-Cookie 속성을 사용하면 클라이언트에 쿠키를 만들수 있다.
  • 쿠키는 사용자가 따로 요청하지 않아도 브라우저가 Request시에 알아서 Request Header를 넣어서 자동으로 서버에 전송해준다.

쿠키의 구성 요소

쿠키는 기본적으로 key, value, domain, path, time으로 구성 되어 있으며 각각

  • key(이름) : 각각의 쿠키를 구별하는 데 사용되는 값이다.
  • value(값) : 쿠키의 key와 관련된 값
  • time(유효시간) : 쿠키가 유지 되는 시간
  • domain(도메인) : 쿠키를 전송할 도메인
  • path(경로) : 쿠키를 사용할 범위, 쿠키를 전송할 요청 경로

쿠키의 동작 방식

  1. 클라이언트가 페이지를 요청
  2. 서버에서 쿠키를 생성
  3. HTTP 해더에 쿠키를 포함 시켜 응답
  4. 브라우저가 종료되어도 쿠리 만료 기간이 지나지 않았더라면 클라이언트에 보관하고 있음
  5. HTTP 해더에 쿠리를 포함 시켜 응답
  6. 서버에서 쿠키를 읽어 이전 상태 정보를 변경 할 필요가 있을 때 쿠키를 업데이트 하여 변경된 쿠키를 HTTP 해더에 포함시켜 응답

위의 동작 방식을 보면 한가지 예제가 생각이 날 것이다.
그것은 바로 자동로그인, 장바구니, 오늘은 더이상 보지 않음(팝업)등의 것이 생각이 날 것이다.

내가 생각하는 것 보다 더 복잡 할 수 있겠지만 조금만 생각해보면

  • 사용자의 컴퓨터 정보를 저장하여 들어오면 자동로그인
  • 쇼핑물에서 로그인 전에 장바구니를 담고나서 로그인 하면 장바구니에 들어가 있는 것
  • '오늘은 더이상 보지 않음' time을 1일로 지정 한후 확인


세션 ( Session )

쿠키와 세션의 가장 큰 차이점은 쿠키는 클라이언트 즉 브라우저에 저장이 되는 반면 세션은 서버에 측에서 관리를 한다.

서버에서는 클라이언트를 구분하기 위해 세션ID라는 것을 부여하고 웹 브라우저가 서버에 접속하여 브라우저가 종료 될때 까지 인증상태를 유지 한다. 물론 접속 시간에 제한을 걸고 일정 기간 동안 응답이 없으면 정보가 유지되지 않게 설정이 가능하다.

사용자에 대한 정보를 서버에 두기 때문에 쿠키보다는 휠신 안전 하다만, 사용자가 많으면 많을수로 트래픽이 놓으면 높을수록 서버에 메모리를 많이 차치하게 된다. 즉 동시 접속자가 많은 웹 사이트인 경우 서버에 과부화를 주게 됩으로 성능 저하에 요인이 될 수도 있다.

클라이언트가 Request을 보내면, 해당 서버의 엔진이 클라이언트에게 유일안 ID를 부여하는데 이 ID가 세션 ID이다

세션 동작 방식

  1. 클라이너트가 서버로부터 ID을 발급 받음
  2. 클라이언트는 세션 ID에 쿠키를 사용해서 저장하고 가지고 있음
  3. 클라이언트는 서버에 요청을 할 때, 발급 받은 쿠키의 세션ID를 같이 서버에 전달해서 요청
  4. 서버는 세션 ID를 전달 받아서 별다른 작업 없이 세션 ID로 세션에 있는 클라리언트 정보를 가져와서 사용
  5. 클라이언트 정보를 가지고 서버 요청을 처리하여 클라리언트에게 응답

세션의 특징

  • 각 클라이언트에게 고유 ID을 부여
  • 세션이 ID로 클라이너트
  • 보안 면에서 쿠키보다 우수 하다
  • 사용자가 많아지면 많이질수록 메모리를 많이 차지 함

쿠키(Cookie)와 세션(Session)의 차이

쿠키외 세션은 비슷한 역활을 하고 동작원리도 비슷하다. 그 이유는 세션은 결국 쿠키를 사용하기 때문이다.

다만 가장 큰 차이점은 사용자의 정보가 저장 되는 위치 이다. 때문에 쿠키는 위에서 설명한 것처럼 서버의 자원을 전혀 사용하지 않고, 그에 비해 세션은 서버의 자원을 사용한다. 그렇게이 보안면에서는 쿠키보다 세션이 더 우수 할 수 밖에 없으며, 속도는 쿠키가 더 빠를 수 밖에 없다.

쿠키는 클라이언트의 로컬에 저장 되기 때문에 변질에 위험이 있다. 이렇게 말하면 그러면 세션도 쿠키를 사용하는데 똑같은거 아니냐고 말 질문을 하면 그건 아니다. 왜냐면 세션도 쿠키를 사용하지만 세션이 쿠키에 저장하는것은 고유 세션ID 이다. 이 ID는 서버에도 저장이 되어 있으며 만약에 변질이 된다고 하면 당연히 서버에서는 응답이 오지 않는다.

다음은 생명주기에 관한것이다. 쿠키는 만료기간이 있지만 파일로 저장이 되기 때문에 브라우저를 종료 해도 계속해서 정보가 남아 있을 수 있다. 또한 만료기간을 넉넉하게 주면 사용자가 삭제 하지 않는 이상 유지가 되게 할 수도 있다. 반면에 세션도 만료기간을 설정 할 수는 있지만 브라우저가 종료 되면 만료기간에 상관 없이 삭제가 된다. (인터넷 창이 2개가 열려 있으면 그것은 공유가 가능하다.)


이렇게 보면 세션이 더 좋은거 같은데 왜 쿠키를 사용하는 것일까?

사용자가 많이지면 서버에 부담이 간다는 이유도 있지만, 해당 서버가 다운되면 모든 세션의 정보가 손실 된다는 단점이딨다.


쿠키/세션은 캐시와 메우 다르다.

쿠키와 세션은 각각 클라이언트와 서버에 저장이 되는 반면에 캐시는 이미지나 css, js파일 등을 서버 앞 단에 저장해놓고 사용하는 것
이다.

한번 캐쉬에 저장이 되면 브라우저들이 참고 하기 때문에 서버에서 변경 사항이 있어서도 사용자는 변경되지 않게 보일 수 있다. 이를 해결 하는 방법은 캐시를 지우던가 서버에서 클라이언트로 응답을 보낼때 header에서 캐시 만료기간을 명시 해주는 방법이 있다.


나도 이 글을 쓰기 전까지는 쿠키와 세션의 차이는 단순 위치, 보안에 대해서만 알았는데 사실 중요한 것은 생명주기에 대한 것이다.

0개의 댓글