Session Fixation은 공격자가 사용자가 로그인하기 전에 알려진 세션 ID를 심어두고, 로그인 후 동일 ID로 사용자 세션을 탈취하는 인증 우회 공격이다.
AI 코딩 도구가 만든 코드에서 가장 자주 누락되며, 누락 시 인증 우회·데이터 탈취·서비스 마비로 직결된다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. 로그인 후 세션 ID를 왜 새로 발급해야 하나요? A. 공격자가 사전에 발급된 세션 ID를 미리 알고 있다면 사용자가 로그인한 뒤에도 동일 ID로 인증 상태에 접근 가능합니다. Q. Django는 자동으로 처리하나요? A. django.contrib.auth.login()이 자동 세션 키 회전을 수행하지만 커스텀 인증 흐름은 직접 cycle_key() 호출이 필요합니다. Q. HttpOnly·Secure 쿠키만으로 충분한가요? A. 충분하지 않습니다. XSS·MITM 차단은 하지만 사전 심기 공격은 세션 재발급으로만 막힙니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | 로그인 후 세션 키 회전 누락 | 치명 |
| 2 | 커스텀 인증 흐름에서 cycle_key() 미호출 | 치명 |
| 3 | 세션 쿠키에 HttpOnly·Secure·SameSite 미적용 | 높음 |
| 4 | 로그아웃 시 세션 무효화 누락 | 높음 |
표준 구현 코드
# Django 표준 — 로그인 후 자동 세션 키 회전
from django.contrib.auth import login as auth_login
def login_view(request):
user = authenticate(request, username=u, password=p)
if user:
auth_login(request, user) # 내부에서 request.session.cycle_key() 호출
return redirect('/dashboard/')
# 커스텀 SSO/OAuth 흐름 — 명시적 호출 필수
def sso_callback(request):
user = oauth_provider.get_user(request)
if user:
request.session.cycle_key() # 핵심 — 새 세션 ID 발급
request.session['user_id'] = user.id
return redirect('/dashboard/')
# settings.py — 세션 쿠키 강화
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
핵심 4요소를 모두 충족해야 결함이 사라진다.
AI 도구는 동작 코드만 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어/데코레이터로 모든 경로에 일괄 적용이 표준이다.
30초 자가진단
# 1. 로그인 전 쿠키 캡처
curl -c before.txt https://yourdomain.com/login/
# 2. 로그인
curl -b before.txt -c after.txt -X POST https://yourdomain.com/login/ -d "username=x&password=y"
# 3. sessionid 비교 — 동일하면 결함
diff <(grep sessionid before.txt) <(grep sessionid after.txt)
위 시그널이 발견되면 결함이다. OWASP: Session Fixation 참조.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | 로그인 직후 request.session.cycle_key() 호출 |
| 2 | SESSION_COOKIE_HTTPONLY/SECURE/SAMESITE 활성화 |
| 3 | 로그아웃 시 request.session.flush() 호출 |
| 4 | 커스텀 SSO/OAuth 콜백 핸들러 명시적 재발급 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검.
CISO·임원: 통합 보안 점검은 SENTRIX 30분 1:1 상담.
결함 발견 시 24시간 안에 패치 완료가 표준이다.