본문으로 건너뛰기
>_ITDITD웹 보안 플랫폼

용어 사전

세션 고정(Session Fixation)이란 — 공격자가 이미 아는 ID로 피해자를 로그인시키는 공격

세션 고정은 공격자가 심어 둔 세션 ID를 피해자가 쓰게 만든 뒤, 그 ID로 로그인하면 피해자를 가장하는 공격입니다. 동작 원리와 진짜 방어법 — 로그인 시 세션 ID 재생성, URL의 ID를 절대 받지 않기, 쿠키 플래그 설정 — 을 방어 관점에서 설명합니다.

게시 2026-06-11 업데이트 2026-06-11 3분 읽기

"피해자가 공격자가 준비한 ID로 로그인한다" — 이것이 세션 고정입니다. 동작 원리와 확실하게 막는 방법을 설명합니다(공격 절차 없음).

왜 통하는가

핵심은 세션 ID가 로그인 전후로 바뀌지 않는 설계입니다. 바뀌지 않는다면, 공격자가 로그인 전에 알던 ID가 로그인 후에도 "인증됨"으로 여전히 작동합니다. 흔한 오해는 "로그인하면 자동으로 새 세션이 생긴다"는 것이지만 — 많은 프레임워크는 명시적으로 재생성을 호출하지 않으면 같은 ID를 그대로 이어 씁니다.

1) 공격자가 피해자에게 알려진 세션 ID를 쓰게 함 (링크 등을 통해)
↓ 피해자가 그 ID를 그대로 둔 채 로그인
2) ID가 재생성되지 않음 = 같은 ID가 "인증됨"이 됨
↓ 공격자는 그 ID를 처음부터 알고 있었음
3) 같은 ID로 접근 = 피해자를 가장함
로그인 시 ID가 바뀌지 않으면, 공격자가 미리 알던 ID가 그대로 인증된다.

CSRFXSS 와 짝지을 수도 있지만, 고정 자체의 본질은 한 가지입니다. 로그인 시 ID가 재생성되지 않았다입니다.

방어: 로그인 시 ID를 재생성하라

1

로그인 성공 시 세션 ID 재생성 (가장 중요)

인증이 성공하는 즉시 기존 ID를 폐기하고 새 세션 ID를 발급하세요(대부분 프레임워크의 session regenerate/renew). 미리 심어 둔 ID는 즉시 무효화됩니다. 권한 상승 시(예: 관리자가 될 때)에도 재생성하세요.
2

URL을 통한 세션 ID를 받지 않기

세션 ID는 쿠키에서 다루고, URL 파라미터로 지정된 ID는 무시하세요. 공격자가 피해자에게 '고정된' ID를 채택하게 만드는 경로를 닫습니다.
3

쿠키 플래그 강화

세션 쿠키에 HttpOnly(JS가 읽을 수 없음), Secure(HTTPS만), SameSite(교차 사이트 전송 억제)를 설정하세요. 관련 하이재킹 경로도 함께 약화시킵니다.
4

세션을 합리적으로 만료시키기

유휴 타임아웃, 로그아웃, 비밀번호 변경 시 만료시켜 고정된 ID가 무한정 살아 있지 못하게 하세요. 비밀번호를 바꿨다면 그 사용자의 다른 모든 활성 세션도 함께 끊어, 미리 심어 둔 ID가 살아남을 틈을 없애세요.

본 사이트의 견해: 프레임워크의 '재생성'을 끄지 마라

세션 고정은 정교한 맞춤 코드가 아니라 한 가지 조치 — 로그인 시 ID 재생성 — 만으로 대부분 차단됩니다. 핵심은 프레임워크가 이미 제공하는 그 메커니즘을 실수로 끄거나 호출하기를 잊지 않는 것입니다. 검증된 구현의 안전한 기본값을 타는 것이 직접 세션 관리를 짜는 것보다 낫습니다. 본 사이트는 "인증/키 처리를 직접 만들지 말 것, 안전한 기본값을 끄지 말 것"을 지킵니다. IDOR 와 마찬가지로, 인증/인가는 모든 요청에서 메커니즘으로 강제되어야 합니다.

다음으로 읽기

FAQ

Q고정은 세션 하이재킹과 무엇이 다른가요?
A

하이재킹은 이미 발급된 누군가의 세션 ID를 훔칩니다. 고정은 그 반대입니다. 공격자가 이미 아는 ID를 피해자가 쓰게 만든 뒤, 피해자가 그 ID로 로그인하기를 기다립니다. 훔치는 것이 아니라, 공격자가 아는 ID를 인증된 상태로 만드는 것입니다.

Q가장 효과적인 방어법은 무엇인가요?
A

로그인하는 순간 세션 ID를 재생성하는 것입니다. 대부분의 프레임워크/세션 라이브러리에 이 기능이 있습니다(session regenerate/renew). 인증에 성공하면 기존 ID를 폐기하고 새 ID를 발급하세요. 그것만으로 공격자가 미리 심어 둔 어떤 ID도 무효화됩니다. 권한 변경 시(예: 관리자가 될 때)에도 재생성하세요.

Q세션 ID를 URL에 넣는 것이 왜 위험한가요?
A

URL의 ID는 공유 링크, Referer 헤더, 로그, 브라우저 기록을 통해 쉽게 유출됩니다 — 공격자가 피해자에게 '고정된' ID를 쓰게 만드는 통로입니다. 세션 ID는 URL 파라미터가 아니라 쿠키에서 다루고, URL로 지정된 ID는 받지 마세요.