cookie란 무엇인가?

Posted by on Thursday, August 27, 2020 Tags: security   2 minute read

cookie란

클라이언트(브라우저) 로컬에서 저장되는 특정 형식을 가진 값을 말한다.

cookie의 특징

유효기간

유효기간을 지정할 수 있고 그 시간내에는 브라우저가 종료되어도 값이 사라지지 않는다.

용량

전체 300개까지 저장가능

하나의 도메인당 20개만 저장가능

하나의 쿠키값은 4KB까지 저장가능

클라이언트에 쿠키 작성 방법

Response Header에 Set-Cookie 속성을 사용하여 만들 수 있다.

쿠키 구성

쿠키의 구성 요소

이름 : 각각의 쿠키를 구별하는 데 사용되는 이름 값 : 쿠키의 이름과 관련된 값 유효시간 : 쿠키의 유지시간 도메인 : 쿠키를 전송할 도메인 경로 : 쿠키를 전송할 요청 경로

자동전송

쿠키안에는 도메인정보가 있는데 해당 도메인에 request시 cookie를 Request Header에 자동으로 넣어서 전송한다.


cookie에 대해서 간단히 알아봤다. 그렇다면 왜 cookie에 대해 알아야할까?

cookie의 용도

보통 서버와 클라이언트간에서 리퀘스트한 대상이 누구인지 판단하기 위한 값을 cookie에 보관하고 리퀘스트시 해당 cookie를 header에 담아서 리퀘스트한 사람이 누구다라는것을 알려주는 용도로 많이 사용한다.

왜? 하필 cookie에 보관하는가

브라우저가 종료되어도 값이 사라지지 않고 리퀘스트시 특별한 설정이 없어도 cookie정보를 알아서 담아 보내주기 때문에 편하다.

왜? 서버에 cookie정보를 항상 담아서 보내줘야하는가?

웹에서 서버와 클라이언트의 통신은 HTTP를 사용한다. 그리고 이 HTTP는 stateless하다는 특징을 가지는데

말그대로 어떤 상태를 가지지 않는다는 의미이다.

이것은 /me라는 페이지에 누가 억세스했는지 모르는것을 의미하는데 A유저에게만 보여주게 하고싶다거나 유저에 따라 다른 결과를 전달하고 싶을때 상당히 곤란하다.

그러므로 클라이언트에서 cookie정보를 리퀘스트 마다 담아서 서버에 보내주면 아 얘가 xx구나 라는 판단이 가능하게 된다.

쿠키를 이용한 인증방식에서 쿠키는 놀이공원 티켓과 같은것

현실세계를 예로 생각해보자. 놀이공원에 가서 돈을 냈는지 안냈는지라는 상태를 확인하는 요소는 티켓(웹에선 cookie)이다.

그런데 무료 놀이공원이라면 사용자(User)가 돈을 냈는지 여부에 대한 상태를 체크할 필요가 없으므로 티켓을 발행해야할 이유도 체크해야할 이유도 없다.

반대로 디즈니랜드에 가보면 사용자(User)가 돈을 내고 티켓을 구매했는지 확인하기 위해 각 어트랙션 앞에서 직원이 티켓을 확인한다.

이 티켓을 확인하는 작업을 웹에서는 cookie를 header에 담아 리퀘스트 한다로 치환해서 생각하면 될거 같다.

쿠키를 활용한 사용자 인증의 동작방식

구체적으로 쿠키를 활용자 인증방식은 아래와 같다.

  1. 클라이언트가 서버에 리퀘스트
  2. 서버는 쿠키를 생성 /세션에 보관
  3. 서버는 생성한 쿠키를 HTTP헤더에 담아서 레스폰스
  4. 클라이언트는 해당 쿠키를 브라우저에 저장
  5. 클라이언트가 서버에 리퀘스트시 해당 쿠키를 담아서 보냄.
  6. 서버에서는 클라이언트가 보낸 쿠키의 정보가 서버의 세션정보와 비교해서 어떤 사용자인지 특정
  7. 해당 사용자만이 억세스가능한 정보를 담아서 클라이언트에 레스폰스

주체를 무엇에 두느냐에 따라 용어가 바뀌는데 예를들어 서버를 주체로 두면 세션 베이스 인증방식이라고도 부른다.

쿠키 업데이트

클라이언트에게 전달받은 쿠키를 서버가 읽어보고 변경 할 필요가 있을때는 쿠키를 업데이트해서 변경된 쿠키를 HTTP헤더에 포함시켜 레스폰스함.

cookie를 이용한 통신은 stateful하다.

위에서 http프로토콜은 stateless하다고 말했는데

cookie를 이용한 통신은 stateless하다고 말할 수 없다.

왜냐면 cookie에 인증을 위한 정보(상태)를 클라이언트가 가지고 있기 때문이다.

그래서 cookie이용한 인증방식을 stateful하다 라고 말할 수 있다.

reference:

https://interconnection.tistory.com/74
https://www.zerocho.com/category/HTML&DOM/post/5918515b1ed39f00182d3048