쿠키와 세션은 인터넷을 사용하는 클라이언트의 인증정보를 포함하고 있다.
🌐 쿠키(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)
공격자가 이용자의 쿠키를 훔치고, 세션에 해당하는 이용자의 인증 상태를 탈취하는 것이다.
'Network > Network' 카테고리의 다른 글
네트워크 프로토콜: HTTP, HTTPS, FTP (0) | 2022.05.13 |
---|---|
DNS(Domain Name System)과 URI, URL, URN (0) | 2022.05.07 |
네트워크 장비: 허브, 스위치, 라우터 (0) | 2022.04.29 |
네트워크 주소: IP Address - (IPv4, IPv6) / MAC Address (0) | 2022.04.29 |
네트워크 메세지 전송 방식: 유니캐스트, 멀티캐스트, 브로드캐스트 (0) | 2022.04.29 |