728x90
X-Requested-With 헤더란
- X-Requested-With 헤더는 주로 웹 애플리케이션에서 AJAX (Asynchronous JavaScript and XML) 요청임을 서버에 알리기 위해 사용
- 즉, 이 헤더가 포함된 요청은 일반적인 웹페이지 전체를 불러오는 것이 아니라, 페이지의 특정 부분만 동적으로 업데이트하기 위해 전송되었음을 의미
- 활용예시: 사용자가 웹사이트의 '더 보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드
AJAX 정상적인 통신 흐름 예시
아래는 X-Requested-With: XMLHttpRequest 헤더가 정상적으로 사용되는 대표적인 시나리오입니다.
1. 사용자 행동: 사용자가 웹사이트의 '더보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드하려고 합니다.
2. 클라이언트 요청 (JavaScript):HTTP
- 사용자의 브라우저에 내장된 JavaScript 코드가 실행됩니다.
- 이 코드는 서버로 비동기 HTTP 요청을 생성합니다. 이때, 요청 헤더에 X-Requested-With: XMLHttpRequest를 포함시킵니다.
- 이 헤더는 "이 요청은 웹페이지 전체를 새로고침하려는 것이 아니라, JavaScript에 의해 생성된 비동기 요청입니다"라는 것을 서버에 알려주는 깃발 역할을 합니다.클라이언트 요청 (JavaScript):HTTP
- 요청 헤더 예시:
GET /api/articles?page=2 HTTP/1.1 Host: example.com X-Requested-With: XMLHttpRequest Content-Type: application/json
3. 서버 응답: JSON
- 서버는 X-Requested-with 헤더를 보고 이 요청이 AJAX 요청임을 인지합니다.
- 따라서 완전한 HTML 페이지 전체를 보내는 대신, 요청에 필요한 데이터만 간결한 형태(주로 JSON 또는 XML)로 응답합니다.
- 만약 이 헤더가 없다면, 서버는 일반적인 페이지 요청으로 오인하여 불필요한 전체 HTML 코드를 보낼 수도 있습니다.
- 응답 본문 예시 (JSON):
{ "articles": [ {"title": "새로운 기사 1", "author": "김기자"}, {"title": "새로운 기사 2", "author": "이기자"} ] }
4. 클라이언트 처리 (JavaScript):
- 브라우저는 서버로부터 받은 JSON 데이터를 파싱 합니다.
- JavaScript는 이 데이터를 사용하여 현재 페이지의 HTML 구조(DOM)를 동적으로 변경하여 새로운 콘텐츠를 사용자에게 보여줍니다. 이 과정에서 페이지 새로고침은 발생하지 않습니다.
정탐/악성 판단을 위한 핵심 체크리스트
1. 헤더 값 자체의 형태
- ✅ 정상 (정탐): 헤더 값이 거의 항상 XMLHttpRequest라는 표준적인 문자열입니다. 이는 jQuery, Axios 등 대부분의 표준 라이브러리가 자동으로 붙여주는 값입니다.
GET /api/posts/next?current=123 HTTP/1.1 Host: my-blog.com X-Requested-With: XMLHttpRequest Accept: application/json
- ❌ 비정상 (악성 의심): F5 문서의 WireX 악성코드처럼, 값이 asdfg, 12345 등 의미 없는 무작위 문자열이거나 아예 비어있다면, 이는 정상적인 라이브러리를 통해 생성된 요청이 아닐 가능성이 매우 높습니다.
GET /?query=attack HTTP/1.1 Host: target-server.com X-Requested-With: asjdfk234 User-Agent: Mozilla/5.0
2. 요청에 담긴 데이터 (Payload)의 내용
- ✅ 정상 (정탐): 요청에 담긴 데이터가 서비스의 기능에 부합합니다. 예를 들어, '2페이지 더 보기' 요청에 {"page": 2} 와 같이 예상 가능한 정상적인 값이 들어있습니다.
POST /api/search HTTP/1.1 Host: nice-shop.com X-Requested-With: XMLHttpRequest Content-Type: application/json {"query": "노트북", "page": 2, "sort": "price_asc"}
- ❌ 비정상 (악성 의심): 데이터가 비정상적이거나 공격 시도로 보입니다.
- 수량 조작: {"quantity": -99} 처럼 논리적으로 말이 안 되는 값
- SQL 인젝션: {"id": "1' OR '1'='1"} 과 같은 공격 구문
- 데이터 부재: 데이터를 보내야 하는 요청인데 아무 데이터도 없는 경우
POST /api/v1/login HTTP/1.1 Host: insecure-bank.com X-Requested-With: XMLHttpRequest Content-Type: application/json {"user_id": "admin' OR '1'='1", "password": "password"}
3. 트래픽의 행동 패턴
- ✅ 정상 (정탐): 사용자의 행동(클릭, 스크롤 등)에 맞춰 필요할 때 한 번씩 요청이 발생합니다. 트래픽 발생 주기가 비규칙적이고 자연스럽습니다.
11:20:05 - GET /api/feed?offset=10 요청 (스크롤) 11:20:12 - GET /api/feed?offset=20 요청 (다시 스크롤) 11:20:19 - POST /api/posts/like 요청 ('좋아요' 클릭)
- ❌ 비정상 (악성 의심):
- 대량 발생 (DDoS): 특정 IP나 여러 IP에서 짧은 시간 동안 동일한 요청이 수백, 수천 건씩 쏟아져 들어옵니다.
- 규칙적인 발생: 사람의 행동이라고 보기 어려울 정도로 1초에 한 번씩 정확하게 요청이 계속 발생합니다.
11:22:01.100 - POST /api/login ({"user":"a","pass":"1234"}) 11:22:01.200 - POST /api/login ({"user":"b","pass":"1234"}) 11:22:01.300 - POST /api/login ({"user":"c","pass":"1234"})
4. 요청이 도달하는 주소 (API Endpoint)
- ✅ 정상 (정탐): 요청이 도달하는 URL 주소가 실제로 AJAX 통신을 사용하도록 개발된 유효한 API 주소입니다. (예: /api/comments, /ajax/load_more)
GET /api/v2/mail/unread-count HTTP/1.1 Host: my-mail-service.com X-Requested-With: XMLHttpRequest
- ❌ 비정상 (악성 의심): AJAX 기능이 전혀 없는 엉뚱한 주소(예: /main.html, /images/logo.png)로 해당 헤더를 포함한 요청이 들어옵니다. 이는 서버가 어떻게 반응하는지 떠보려는 스캐닝 공격일 수 있습니다.
GET /static/css/main.css HTTP/1.1 Host: some-website.com X-Requested-With: XMLHttpRequest
참고자료
Wirex Android DDoS Malware Adds UDP Flood
As quickly as attackers commandeer IoT devices to build more “thingbots,” they continue to evolve their attack types and functionality.
www.f5.com