"피해자가 공격자가 준비한 ID로 로그인한다" — 이것이 세션 고정입니다. 동작 원리와 확실하게 막는 방법을 설명합니다(공격 절차 없음).
왜 통하는가
핵심은 세션 ID가 로그인 전후로 바뀌지 않는 설계입니다. 바뀌지 않는다면, 공격자가 로그인 전에 알던 ID가 로그인 후에도 "인증됨"으로 여전히 작동합니다. 흔한 오해는 "로그인하면 자동으로 새 세션이 생긴다"는 것이지만 — 많은 프레임워크는 명시적으로 재생성을 호출하지 않으면 같은 ID를 그대로 이어 씁니다.
CSRF 나 XSS 와 짝지을 수도 있지만, 고정 자체의 본질은 한 가지입니다. 로그인 시 ID가 재생성되지 않았다입니다.
방어: 로그인 시 ID를 재생성하라
로그인 성공 시 세션 ID 재생성 (가장 중요)
URL을 통한 세션 ID를 받지 않기
쿠키 플래그 강화
HttpOnly(JS가 읽을 수 없음), Secure(HTTPS만), SameSite(교차 사이트 전송 억제)를 설정하세요. 관련 하이재킹 경로도 함께 약화시킵니다.세션을 합리적으로 만료시키기
본 사이트의 견해: 프레임워크의 '재생성'을 끄지 마라
세션 고정은 정교한 맞춤 코드가 아니라 한 가지 조치 — 로그인 시 ID 재생성 — 만으로 대부분 차단됩니다. 핵심은 프레임워크가 이미 제공하는 그 메커니즘을 실수로 끄거나 호출하기를 잊지 않는 것입니다. 검증된 구현의 안전한 기본값을 타는 것이 직접 세션 관리를 짜는 것보다 낫습니다. 본 사이트는 "인증/키 처리를 직접 만들지 말 것, 안전한 기본값을 끄지 말 것"을 지킵니다. IDOR 와 마찬가지로, 인증/인가는 모든 요청에서 메커니즘으로 강제되어야 합니다.
다음으로 읽기
FAQ
Q고정은 세션 하이재킹과 무엇이 다른가요?
하이재킹은 이미 발급된 누군가의 세션 ID를 훔칩니다. 고정은 그 반대입니다. 공격자가 이미 아는 ID를 피해자가 쓰게 만든 뒤, 피해자가 그 ID로 로그인하기를 기다립니다. 훔치는 것이 아니라, 공격자가 아는 ID를 인증된 상태로 만드는 것입니다.
Q가장 효과적인 방어법은 무엇인가요?
로그인하는 순간 세션 ID를 재생성하는 것입니다. 대부분의 프레임워크/세션 라이브러리에 이 기능이 있습니다(session regenerate/renew). 인증에 성공하면 기존 ID를 폐기하고 새 ID를 발급하세요. 그것만으로 공격자가 미리 심어 둔 어떤 ID도 무효화됩니다. 권한 변경 시(예: 관리자가 될 때)에도 재생성하세요.
Q세션 ID를 URL에 넣는 것이 왜 위험한가요?
URL의 ID는 공유 링크, Referer 헤더, 로그, 브라우저 기록을 통해 쉽게 유출됩니다 — 공격자가 피해자에게 '고정된' ID를 쓰게 만드는 통로입니다. 세션 ID는 URL 파라미터가 아니라 쿠키에서 다루고, URL로 지정된 ID는 받지 마세요.