security
CHAPTER 61 / 84
읽기 약 2분
FUNCTION
HTTP 프로토콜 해부
핵심 개념
GET, POST, 헤더, 쿠키 — HTTP의 구조를 이해해야 웹 보안을 할 수 있다.
본문
HTTP 요청·응답 기본 구조
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
# 원시 HTTP 요청은 이렇게 생겼습니다 — requests가 자동 생성
# 요청
"""
GET /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGc...
"""
# 응답
"""
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionid=abc123; HttpOnly; Secure
X-Frame-Options: DENY
{"users": [...]}
"""HTTP 메서드와 의미
| 메서드 | 의미 | 보안 관점 |
|---|---|---|
| GET | 조회 | URL에 데이터 노출 → 비밀번호 절대 금지 |
| POST | 생성 | 본문에 데이터 → CSRF 토큰 필수 |
| PUT | 전체 수정 | 인증 필수 |
| PATCH | 부분 수정 | 인증 + 권한 검증 |
| DELETE | 삭제 | 멱등성 + 인증 |
| OPTIONS | CORS 사전 요청 | preflight 응답 검증 |
상태 코드 — 보안 분석에서 중요한 것들
SECURITY_RELEVANT_STATUS = {
200: '성공 — 정상',
301: '영구 이동 — HTTPS 강제 리다이렉트 확인',
401: '인증 필요 — 로그인 시도 실패 패턴 추적',
403: '권한 없음 — 권한 우회 시도 의심',
404: 'Not Found — 디렉토리 브루트포싱 의심',
405: '메서드 미허용 — 허용 메서드 노출',
429: 'Rate Limit — 봇/스캐너 차단됨',
500: '서버 오류 — 정보 누설 가능',
502: '게이트웨이 오류 — 백엔드 노출 가능',
}보안 헤더 5대장
SECURITY_HEADERS = {
'Content-Security-Policy': 'XSS 방어',
'Strict-Transport-Security': 'HTTPS 강제 (HSTS)',
'X-Frame-Options': '클릭재킹 방어',
'X-Content-Type-Options': 'MIME 스니핑 방어',
'Referrer-Policy': 'Referer 정보 노출 제어',
}TLS 기초 — HTTPS의 작동
1. ClientHello: 클라이언트가 지원 암호 스위트 전송
2. ServerHello: 서버가 인증서(공개키) 전송
3. Key Exchange: 세션 키 합의 (ECDHE)
4. Encrypted Application Data: AES로 본문 암호화 통신
→ 이 과정 중간에 끼어드는 게 MITM 공격
→ HSTS + 인증서 검증으로 방어requests로 첫 요청 보내기
import requests
url = 'https://httpbin.org/get'
r = requests.get(
url,
headers={'User-Agent': 'WhiteHat-Scanner/1.0'},
timeout=5,
)
print('상태 코드:', r.status_code)
print('응답 헤더:', dict(r.headers))
print('서버 정보:', r.headers.get('Server', 'Unknown'))
print('Content-Type:', r.headers.get('Content-Type'))⚠️ 첫 보안 점검: 서버 정보 누설
def check_server_disclosure(url: str) -> dict:
"""서버가 자기 정보를 너무 많이 흘리고 있는지 점검."""
r = requests.head(url, timeout=5, allow_redirects=True)
leaks = {}
for header in ['Server', 'X-Powered-By', 'X-AspNet-Version']:
if header in r.headers:
leaks[header] = r.headers[header]
return leaks
# print(check_server_disclosure('https://example.com'))
# {'Server': 'nginx/1.18.0 (Ubuntu)'} ← Ubuntu 버전 노출됨!AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
이 HTTP 응답 헤더를 분석해서 어떤 보안 헤더가 빠져있고 어떤 정보가 누설되고 있는지 진단해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
HTTP 메서드와 상태 코드의 보안 관점 의미 비교표(Top 15)를 실전 시나리오와 함께 보여줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 웹사이트의 모든 엔드포인트에 대한 HEAD 요청 응답을 전체 분석해서 보안 헤더 점수를 매겨줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 웹 보안 헤더 표준 변화 — CSP Level 3, COEP/COOP의 실무 도입률을 솔직히 알려줘.
⭐ 이것만 기억하세요
HTTP 프로토콜 해부는 이 3가지만 확실히 잡으세요
1.HTTP 메서드·상태 코드·보안 헤더의 의미를 알아야 웹 트래픽을 분석할 수 있다
2.X-Frame-Options/CSP/HSTS 등 보안 헤더 5대장은 웹 보안의 첫 번째 점검 항목이다
3.다음 챕터에서 requests 라이브러리를 깊이 다뤄 HTTP 분석 도구를 만든다
공유하기
진행도 61 / 84