kaki1013
[STAGE 3] Cookie & Session - Cookie & Session 본문
# Background: Cookie & Session
0. 서론
현대의 웹 서비스는 대부분 로그인을 통해 마이페이지, 유료 서비스 등 개인만의 서비스를 이용함
→ 웹 서버는 수많은 클라이언트와 HTTP 프로토콜을 사용해 통신함
→ 손님 계정으로 로그인 : 손님이 이용할 수 있는 서비스를 제공해야 함
→ 관리자 계정으로 로그인 : 데이터베이스, 회원 관리 등의 관리자 페이지를 제공해야 함
웹 서버는 수많은 클라이언트를 어떻게 구별하고 서로 다른 결과를 반환할까?
: HTTP 프로토콜로 웹 서버와 통신할 때
→ 웹 서버에 명령을 내리기 위해 GET, POST와 같은 메소드 & 자원의 위치를 가리키는 URL 등이 포함
→ 이외에도 헤더(Header)를 통해서 웹 서버에게 요청을 보냄 & 웹 서버는 헤더를 읽고 클라이언트에게 결과 값을 반환
→ 헤더에는 클라이언트의 정보와 요청의 내용을 구체화하는 등의 데이터가 포함
→ 클라이언트의 인증 정보 또한 포함될 수 있음 & Cookie와 Session : 클라이언트의 인증 정보를 포함
1. 쿠키
(1) 쿠키
웹 서버는 클라이언트를 기억할 수 없음
이유 1 : 클라이언트의 IP 주소 & User-Agent : 매번 변경될 수 있는 고유하지 않은 정보
이유 2 : HTTP 프로토콜의 Connectionless와 Stateless 특징
→ HTTP 프로토콜 특징
Connectionless | 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺음 |
Stateless | 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없음 |
쿠키(Cookie)가 탄생한 이유 = Connectionless, Stateless 특성을 갖는 HTTP에서 상태를 유지하기 위함
쿠키 = Key와 Value로 이뤄진 일종의 단위
→ 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송
→ 서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분 가능
(2) 쿠키의 용도
: 일반적으로 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용
정보 기록
예시 : 웹 서비스 사용 시 종종 등장하는 팝업 창에 있는 “다시 보지 않기”, “7일 간 표시하지 않기” 버튼
웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록 & 쿠키를 통해 팝업 창 표시 여부를 판단
→ 과거에는 클라이언트의 정보를 저장하기 위해 쿠키가 종종 사용됨
→ 쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있음
→ 최근에는 이러한 단점을 보완하기 위해 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장함
상태 정보
많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공
→ 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 함
→ 이때 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용
(3) 쿠키 유무에 따른 통신
쿠키가 없는 통신
: 서버는 요청을 보낸 클라이언트가 누군지 알 수 없음 → 현재 어떤 클라이언트와 통신하는지 알 수 없음
쿠키가 있는 통신에서
: 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함 & 서버는 해당 쿠키를 통해 클라이언트를 식별함
(4) 쿠키 변조
쿠키 : 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보
→ 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있음
→ if 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별 → 공격자가 타 이용자를 사칭해 정보를 탈취 가능
2. 세션
(1) 세션
앞에서 봤듯이, 클라이언트가 쿠키를 변조해 서버에 요청을 보낼 수 있음 in 웹 통신
→ 쿠키에 인증 상태를 저장 but 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션(Session)을 사용
→ 인증 정보를 서버에 저장 & 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에 전달하는 방식으로 작동
→ 해당 키(유추할 수 없는 랜덤한 문자열) = 일반적으로 Session ID라고 함
→ 브라우저는 해당 키를 쿠키에 저장 & 이후에 HTTP 요청을 보낼 때 사용
→ 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인
cf. 쿠키 : 데이터 자체를 이용자가 저장 & 세션 : 서버가 저장
(2) 쿠키 적용법
1. 쿠키의 특징
- 클라이언트에 저장 → 클라이언트는 저장된 쿠키를 조회, 수정, 추가 가능
- 클라이언트가 서버에 요청을 보낼 때 저장된 쿠키를 요청 헤더에 넣어 전송
→ 이용자가 요청을 보낼 때 쿠키 헤더를 변조 가능 - 쿠키를 설정할 때 : 만료 시간을 지정 가능 & 만료 시간 이후 : 클라이언트에서 쿠키가 삭제됨
- 쿠키의 만료는 클라이언트(브라우저)에서 관리됨
2. 쿠키를 실제로 웹 페이지에 적용할 수 있는 방법
쿠키는 서버와 클라이언트 둘 다 설정 가능
- 서버 : HTTP 응답 중 헤더에 쿠키 설정 헤더 (Set-Cookie)를 추가 → 클라이언트의 브라우저가 쿠키를 설정함
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;
...
-클라이언트 : 자바스크립트를 사용해 쿠키를 설정
document.cookie = "name=test;"
document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"
→ 크롬 Console :
document.cookie를 입력하면 쿠키 정보를 확인 가능
But 쿠키 옵션(HttpOnly)에 따라 자바스크립트에서 쿠키 확인이 불가능 할 수 있음
→ 크롬 Application :
좌측에 나열된 목록에서 Cookies를 펼치면 Origin 목록을 확인 가능
Origin(https://dreamhack.io)을 누르면 설정 된 쿠키 정보를 확인 / 수정할 수 있음
(3) 세션 활용
드림핵 로그인 기능을 통해 세션을 알아보면..
- 드림핵 로그인 페이지에서 우클릭 후 검사를 클릭하고 Network 탭을 누름
→ Preserve log를 체크하고 로그인 : 로그인 성공 시 응답을 볼 수 있음
→ 응답을 살펴보면, 서버에서 set-cookie 헤더를 통해 브라우저의 쿠키에 세션 정보를 저장하는 것을 확인 가능 - 크롬 Application에서 Cookies 목록 안의 https://dreamhack.io 를 누름
→ 서버의 set-cookie 헤더를 통해 설정된 쿠키를 확인 가능 - sessionid 헤더의 값을 메모장에 복사함
→ 이후 sessionid 헤더의 값을 우클릭한 후 Delete를 클릭하면 브라우저의 쿠키에 저장된 세션 값이 삭제됨
→ 세션 값을 삭제하고 드림핵 페이지를 새로고침하면 로그인이 풀려있는 것을 확인 가능 - 쿠키의 빈 칸을 더블 클릭 → sessionid 헤더를 추가 & 이전에 복사한 세션 값을 입력
→ 브라우저의 쿠키에 세션 값이 설정됨 & 드림핵 페이지를 새로고침하면 로그인이 되는 것을 확인 가능
쿠키에는 세션 정보가 저장되어 있고 서버는 이를 통해 이용자 식별하고 인증을 처리함
세션 하이재킹 (Session Hijacking)
: 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있음
'버그바운티 스터디 > Web Hacking' 카테고리의 다른 글
[STAGE 4] Cross-Site-Scripting (XSS) (0) | 2023.07.31 |
---|---|
[STAGE 3] Cookie & Session - Same Origin Policy (0) | 2023.07.31 |
[STAGE 2] Background(Web) - 웹 브라우저 - Browser DevTools (0) | 2023.07.30 |
[STAGE 2] Background(Web) - 웹 브라우저 - Web Browser (0) | 2023.07.30 |
[STAGE 2] Background(Web) - 웹 기본상식 - HTTP/HTTPS (0) | 2023.07.28 |