본문 바로가기

Spring

쿠키(Cookie)와 세션(Session)

728x90

1. HTTP 프로토콜의 특징

  • Connectionless 프로토콜, 연결 지향
    • 클라이언트가 서버에 요청했을 때, 그 요청(request)에 맞는 응답(response)을 보낸 후 연결을 끊는 처리 방식이다.
    • HTTP 1.1 버전에서 커넥션을 계속 유지하고 요청을 재활용하는 기능이 디폴트 옵션으로 추가되었다.
      → HTTP header에 keep alive 옵션으로 커넥션을 재활용 하게 된다.
    • HTTP가 연결 지향인 TCP 위에서 구현되었기 때문에 연결 지향적이라고 할 수 있다고 하지만, 아직까지는 네트워크 관점에서 keep alive는 옵션으로 두고, 서버 측에서 비연결 지향적인 특성으로 커넥션 관리에 대한 비용을 줄이는 것을 명확한 장점으로 보기 때문에 비연결 지향으로 본다.
  • Stateless 프로토콜
    • 커넥션을 끊는 순간 클라이언트와 서버 통신이 끝나고 상태 정보는 유지하지 않는 특성
    • 클라이언트와 첫 번째 통신에서 데이터를 주고받았다고 해도 두 번째 통신에서 이전 데이터를 유지하지 않지만 실제로는 데이터 유지가 필요한 경우가 많다.

=> 서버와 클라이언트가 통신할 때 통신이 연속적으로 이어지지 않고 한 번 통신되면 끊어져 서버는 클라이언트가

     누구인지 계속 인증해줘야 하는데, 이는 번거롭고 귀찮은 과정이다.

==> 이런 번거로움을 쿠키와 세션으로 해결 가능하다!! 서버가 쿠키, 세션을 통해서 클라이언트 인증을 확인할 수 있다.

 


 

2. 쿠키(Cookie)

  • key - value 형식의 문자열 덩어리
  • HTTP의 일종으로 클라이언트가 어떤 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일이다.
  • 각 사용자마다 브라우저에 정보를 저장해 고유 정보 식별이 가능한 것이다.
  • HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장했다가 필요 시 정보를 참조하거나 재사용할 수 있다.

 

3. 쿠키의 특징과 단점

  • 이름, 값, 만료일, 경로 정보로 구성되어있다.
  • 클라이언트에 총 300개의 쿠키 저장이 가능하고 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
    하나의 쿠키는 4KB까지 저장 가능하다.
  • 보안에 취약하다는 엄청난 단점!!! → 요청 시 쿠키 값을 그대로 보내기 때문에 유출 및 조작당할 위험이 존재한다.
  • 쿠키에 용량 제한이 있어 많은 정보를 담을 수 없다.
  • 웹 브라우저마다 쿠키에 대한 지원 형태가 다르기 때문에 브라우저 간 공유가 불가능하다.
  • 쿠키 사이즈가 커질수록 네트워크에 부하가 심해진다.

 

4. 쿠키의 인증 방식

   1) 브라우저(클라이언트)가 서버에 요청, 접속을 보낸다 → 사용자가 웹사이트에 접근하는 것

   2) 서버는 클라이언트의 요청에 대한 응답을 작성할 때 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의

        set-cookie에 담는다.

       → 웹 서버가 쿠키를 생성하고 쿠키에 정보를 담아 http 화면을 돌려줄 때 같이 클라이언트에 돌려준다.

   3) 넘겨받은 쿠키는 로컬 pc에 저장해 클라이언트가 갖고 있다가 다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다.

   4) 동일 사이트 재방문 시 클라이언트의 pc에 해당하는 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.

 


 

5. 세션(Session) 인증

  • 쿠키의 보안 이슈를 해결하기 위해 세션은 비밀번호 등 클라이언트의 민감한 인증 정보를 서버 측에 저장하고 관리한다. → 서버의 메모리나 로컬 파일, 데이터베이스에 저장한다.
  • "민감한 정보"는 클라이언트에 보내지 말고 "서버에서 모두 관리"한다!!
  • 일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시키는 기술이다.
  • 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료해 연결을 끝내는 시점에
    방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 이것을 "세션"이라고 한다.

 

6. 세션의 특징과 단점

  • 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
    → 웹 서버에 저장되는 쿠키 = 세션 쿠키
  • 브라우저를 닫거나 서버에서 세션을 삭제했을 때만 삭제가 되므로 쿠키보다 비교적으로 보안이 좋다.
  • 서버 용량이 허용하는 한에서 저장 데이터에 제한이 없다.
  • 각 클라이언트에 고유 session id를 부여해 session id로 클라이언트를 구분하고 각 요구에 맞는 서비스를 제공한다.
  • 세션 객체의 형태는 session id(key에 해당) - value로 구성된다
    value는 세션 생성시간, 마지막 접근 시간 및 유저가 저장한 속성 등이 map 형태로 저장된다.
  • session id자체는 유의미한 개인 정보를 담고 있지 않으나 "session id자체를 탈취해 클라이언트인 척 위장할 수 있다"는 한계점이 존재한다.
    → 서버에서 IP 특정을 통해 해결 가능한 문제!
  • 서버에서 세션 저장소를 사용해 요청이 많아지면 서버에 부하가 심해진다.

 

7. 세션 인증 방식

   1) 유저가 웹사이트에서 로그인하면서 세션이 서버 메모리나 데이터베이스 상에 저장된다
       → 세션 식별을 위한 session id를 기준으로 정보가 저장된다.

   2) 서버에서 브라우저의 쿠키에 session id를 저장한다.

   3) 쿠키에 정보가 담겨있기 때문에 브라우저는 해당 사이트에 대한 모든 요청에 session id를 쿠키에 담아 전송한다.

   4) 서버는 클라이언트가 보낸 session id와 서버 메모리로 관리하고 있는 session id를 비교해 인증을 수행한다.

 

 

 


 

 

[참고 자료]

https://velog.io/@octo__/%EC%BF%A0%ED%82%A4Cookie-%EC%84%B8%EC%85%98Session#%EC%BF%A0%ED%82%A4%EA%B0%92-%ED%99%95%EC%9D%B8-%EB%B0%8F-%EB%8B%A8%EC%A0%90

https://dev-coco.tistory.com/61#head5

https://jhbljs92.tistory.com/entry/1-JWT-%ED%86%A0%ED%81%B0-%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-%ED%86%A0%ED%81%B0

 

728x90