security
CHAPTER 63 / 84
읽기 약 2분
FUNCTION
세션과 쿠키 분석
핵심 개념
웹 애플리케이션의 인증 상태를 유지하는 세션/쿠키의 동작 원리와 취약점을 분석한다.
본문
requests.Session() — 쿠키 자동 유지
# ⚠️ 이 코드는 허가된 환경에서만 사용하세요.
import requests
# 단일 요청 — 매번 새 연결, 쿠키 리셋
r = requests.get('https://httpbin.org/cookies/set/visited/yes')
r2 = requests.get('https://httpbin.org/cookies') # 쿠키 없음
# Session — 쿠키 자동 유지 + 연결 재사용 (성능 ↑)
s = requests.Session()
s.headers.update({'User-Agent': 'WhiteHat/1.0'})
s.get('https://httpbin.org/cookies/set/sessionid/abc123')
r = s.get('https://httpbin.org/cookies')
print(r.json()) # {'cookies': {'sessionid': 'abc123'}}쿠키의 보안 플래그
def analyze_cookies(url: str) -> list[dict]:
"""Set-Cookie 헤더의 보안 플래그를 분석."""
s = requests.Session()
r = s.get(url, timeout=5, allow_redirects=False)
results = []
for cookie in s.cookies:
results.append({
'name': cookie.name,
'domain': cookie.domain,
'path': cookie.path,
'secure': cookie.secure,
'httponly': cookie._rest.get('HttpOnly') is not None,
'samesite': cookie._rest.get('SameSite', 'None'),
'expires': cookie.expires,
})
return results보안 플래그의 의미
| 플래그 | 효과 | 누락 시 위험 |
|---|---|---|
Secure | HTTPS에서만 전송 | HTTP에서 쿠키 탈취 |
HttpOnly | JS에서 접근 불가 | XSS로 세션 탈취 |
SameSite=Strict | 외부 사이트 요청 시 미전송 | CSRF 공격 |
Domain 제한 | 특정 도메인만 | 서브도메인 탈취 |
Expires | 만료 시간 | 세션 영구 유지 위험 |
로그인 폼 자동 전송
# DVWA(Damn Vulnerable Web App) 같은 학습용 환경에서만!
def auto_login(login_url: str, username: str, password: str) -> requests.Session:
s = requests.Session()
# 1. 로그인 페이지 GET → CSRF 토큰 추출
r = s.get(login_url, timeout=5)
# 실제로는 BeautifulSoup으로 <input name="csrf"> 찾기 (다음 챕터)
# 2. 로그인 POST
r = s.post(login_url, data={
'username': username,
'password': password,
# 'csrf_token': extracted_token, # 다음 챕터에서
}, timeout=5, allow_redirects=True)
# 3. 로그인 성공 여부 판단
if 'Logout' in r.text or r.url.endswith('/dashboard'):
return s # 세션 반환 → 이 세션으로 인증 필요한 페이지 접근
raise PermissionError('로그인 실패')
# 사용 (DVWA 로컬 실행 가정)
# session = auto_login('http://localhost/login.php', 'admin', 'password')
# r = session.get('http://localhost/admin/users')세션 고정 공격 (Session Fixation)
# 공격 시나리오
"""
1. 공격자가 세션 ID를 미리 가짐: sessionid=ATTACKER123
2. 피해자에게 그 세션 ID로 로그인하게 만듦
3. 피해자가 로그인하면 → 그 세션이 인증된 상태가 됨
4. 공격자가 같은 세션으로 접근 → 피해자 행세
방어: 로그인 직후 반드시 세션 ID를 새로 발급해야 함
"""
def detect_session_renewal(login_url: str, creds: dict) -> bool:
"""로그인 전후 세션 ID가 바뀌는지 점검."""
s = requests.Session()
s.get(login_url)
before = s.cookies.get('sessionid') or s.cookies.get('PHPSESSID')
s.post(login_url, data=creds)
after = s.cookies.get('sessionid') or s.cookies.get('PHPSESSID')
return before != after # True여야 안전⚠️ 책임 있는 분석
- 자기 계정의 쿠키만 분석
- 학습용 환경(DVWA, Juice Shop, TryHackMe)에서만 자동화
- 운영 사이트의 쿠키 탈취·세션 고정은 명백한 불법
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 웹앱의 Set-Cookie 헤더를 분석해서 Secure/HttpOnly/SameSite 누락과 세션 재발급 누락 위험을 점검해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
requests.Session()으로 DVWA·Juice Shop 같은 학습 환경에 자동 로그인하는 실전 코드를 보여줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 사이트의 모든 인증 흐름(로그인/로그아웃/비번 재설정)에 대해 쿠키 보안 종합 리포트를 만들어줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 SameSite=Lax가 기본값이 된 이후 CSRF 공격 양상이 어떻게 바뀌었는지 솔직히 알려줘.
⭐ 이것만 기억하세요
세션과 쿠키 분석은 이 3가지만 확실히 잡으세요
1.Session()으로 쿠키를 자동 유지하면 인증 필요한 워크플로우를 자동화할 수 있다
2.Secure/HttpOnly/SameSite 3대 플래그는 쿠키 보안의 첫 점검 항목이다
3.다음 챕터에서 REST API 엔드포인트를 체계적으로 탐색하는 방법을 배운다
공유하기
진행도 63 / 84