Network/Network

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

쿠키와 세션은 인터넷을 사용하는 클라이언트의 인증정보를 포함하고 있다. 

🌐 쿠키(Cookie)


Cookie는 HTTP의 Connectionless, Stateless의 특성을 고려하고, HTTP에서 상태를 유지할 수 있도록 고안된 개념으로, Key와 Value로 이뤄진 일종의 단위이다.

서버가 클라이언트에게 쿠키를 발급하게 되면, 클라이언트는 서버에 요청을 보낼 때 마다 쿠키를 같이 전송하고, 서버는 클라이언트의 요청에 포함된 “쿠키”를 확인해 클라이언트를 구분할 수 있다.

 

클라이언트의 IP주소와 User-Agent는 매번 변경될 수 있는 고유한 정보
+
HTTP의 Connectionless와 Stateless 특징

⇒ 웹 서버에서는 클라이언트를 기억할 수 없다.
HTTP의 Connectionless
: 하나의 요청에 하나의 응답을 한 후 연결을 종료한다.
HTTP의 Stateless
: 통신이 끝난 후 상태 정보를 저장하지 않는다.

 

🤜 쿠키의 용도

① 정보 기록

예를 들면 인터넷을 사용할 때 팝업 창이 뜨는 경우가 있는데, 이 때 "일주일간 보지않기" 등과 같은 팝업 옵션이 존재한다. 이처럼 각 클라이언트의 팝업 옵션 등을 기억하기 위해 쿠키에 해당 정보를 기억하고 쿠키를 통해 팝업 창의 표시 여부를 판단할 수 있다. 

 

하지만 쿠키를 서버와 통신할 때마다 전송하기 때문에 쿠키가 필요없는 요청을 보낼 때 리소스의 낭비가 발생하게 된다. 이러한 단점을 보완하기 위해 최근에는 "Modern Storage APIs"를 통해 데이터를 저장하는 방식을 권장한다.

 

② 상태 정보 표현

클라이언트의 로그인 상태와 이용자를 구별하기 위한 값을 쿠키에 저장해 사용한다.


🤛 쿠키가 없는 / 있는 통신 

쿠키가 없는 통신

쿠키가 없는 통신에서는, 서버가 클라이언트를 식별할 수 없어 현재 어떤 클라이언트와 통신하는지 알 수 없다.

 

쿠키가 있는 통신

반면, 쿠키를 사용해 HTTP 통신을 할 경우, 클라이언트가 서버에 요청을 보낼 때마다 쿠키를 포함하고 서버는 해당 쿠키를 통해 클라이언트를 식별할 수 있다.

 


🤛 쿠키 변조

쿠키는 클라이언트의 브라우저에 저장되고, 클라이언트의 요청에 포함되는 정보다. 따라서, 악의적인 클라이언트가 쿠키 정보를 변조해 서버에 해당 쿠키를 포함한 요청을 보낼 수 있다. 특히 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 공격자는 타 이용자를 사칭해 정보를 탈취할 수 있다.

 


🤛 쿠키 적용법

cookie는 클라이언트에 저장되기 때문에 클라이언트는 저장된 쿠키를 조회, 수정, 추가할 수 있다.

클라이언트가 서버에 요청(Request)을 보낼 때 저장된 쿠키를 Request Header에 넣어 전송하기 때문에 이용자가 쿠키 헤더를 변조할 수 있게 된다. 또한, 쿠키를 설정할 때는 만료 시간을 지정할 수 있고, 만료 시간 후에는 클라이언트에서 쿠키가 삭제된다. 이러한 부분은 클라이언트인 브라우저에서 관리된다.

 

쿠키 설정- 서버

HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
Set-Cookie: name=test;
Set-Cookie: age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;
...

HTTP Response Header에 Set-Cookie를 추가하면 클라이언트의 브라우저가 쿠키를 설정할 수 있다.

 

쿠키 설정-클라이언트

document.cookie = "name=test;"
document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"

자바스크립트를 사용해 쿠키를 설정한다.

  • Chrome의 Console이나 Chrome Application을 이용해 설정할 수 있다.

🌐 세션(Session)


쿠키에 인증 상태를 저장하지만 (악성) 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 Session을 사용한다.

→ Cookie 변조에 대응하기 위해 사용되는 개념

세션은 인증 정보를 서버에 저장하고, 그 인증 정보에 접근할 수 있는 키를 만들어 클라이언트에 전달한다.

  • 키는 유추할 수 없는 랜덤한 문자열로, Session ID라고 한다.

브라우저는 해당 키(SessionID)를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용한다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인한다.

 

 


🤛세션 하이재킹(Session Hijacking)

공격자가 이용자의 쿠키를 훔치고, 세션에 해당하는 이용자의 인증 상태를 탈취하는 것이다. 

SMALL