웹 서버는 수많은 클라이언트 HTTP 프로토콜을 사용해서 통신한다.
클라이언트가 손님 계정으로 로그인했다면 손님이 이용할 수 있는 서비스를 제공해야 하고, 관리자 계정으로 로그인했다면 데이터베이스, 회원 관리 등의 관리자 페이지를 제공해야 한다.
즉, 서버는 클라이언트가 어떠한 권한으로 접속했는지에 따라 다른 서비스를 제공해야 할 수 있다. 그러므로 웹 서버는 수많은 클라이언트들을 구별할 필요가 있다. 클라이언트의 인증 정보를 통해 구분한다.
클라이언트가 서버에게 HTTP 프로토콜로 request를 보낸다. 여기에는 GET, POST와 같은 메소드와 자원의 위치를 가리키는 URL 등이 포함되어 있고, 헤더가 있다. 헤더에는 클라이언트의 정보와 요청의 내용을 구체화하는 등의 데이터가 포함되는데, 클라이언트의 인증 정보가 또한 포함될 수 있다. 쿠키와 세션이 이에 해당한다.
쿠키
: Key와 Value로 이루어진 일종의 단위로, 서버가 클라이언트에게 쿠를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송하며 서버는 이를 확인해 클라이언트를 구분할 수 있다. 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용된다.
클라이언트의 IP 주소와 User-Agent는 매번 변경될 수 있는 고유하지 않은 정보이고, HTTP 프로토콜의 Connectionless와 Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없다. 이러한 특성이 있 HTTP에서 상태를 유지하기 위해 쿠키(Cookie)가 필요하다.
- Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미한다.
- Stateless : 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미한다.
쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있다. 최근에는 이러한 단점을 보하기 위해 Modern Storage APIS를 통해 데이터를 저장하는 방식을 권장하고 있다.
한편, 쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보이다. 그래서, 악의적인 클라이언트는 쿠키 정보를 변조해서 서버에 요청을 보낼 수 있다. 만약, 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별하면, 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있다. 이를 변조할 수 없게 하려 세션(Session)이 필요하다.
세션
: 쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 사용하는 것이다
인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동한다. 이를 Session ID라고 한다. 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용한다.
웹 브라우저에서 개발자 모드를 통해 Network 옵션에 들어가 보면 Cookie에 해당 하는 정보를 확인할 수 있다.
여기서, sessionid를 delete하고 새로 고침을 하면 로그아웃이 되어있는 것을 확인할 수 있으며, sessionid를 다시 입력하고 새로 고침 하면 로그인되어 있음을 확인할 수 있다.
하지만, 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹(Session Hijacking)이라고 한다
'해킹 > 웹 해킹(Web Hacking)' 카테고리의 다른 글
XSS란? (0) | 2024.01.06 |
---|---|
동일 출처 정책(Same origin Policy) SOP란? (0) | 2024.01.05 |
개발자 도구와 기능 (0) | 2023.12.27 |
웹 브라우저(Web Browser) (0) | 2023.12.26 |
HTTP란? (0) | 2023.12.26 |