세션 고정 공격의 정의
세션 고정 공격은 공격자가 미리 알고 있는 세션 ID를 피해자에게 강제로 사용하게 만든 뒤, 피해자가 로그인에 성공하면 그 세션 ID를 그대로 이용해 계정에 접근하는 공격 기법입니다. 일반적인 세션 하이재킹은 사용자의 세션 ID를 ‘탈취’하는 방식이지만, 세션 고정 공격은 공격자가 세션 ID를 먼저 ‘심어두고’ 피해자가 로그인해서 인증까지 마치도록 유도하는 점이 특징입니다.
비유하자면, 공유 사물함의 비밀번호를 미리 설정해두고 그 사물함을 다른 사람에게 ‘이거 써도 돼요’라며 안내한 뒤, 그 사람이 귀중품을 넣고 나면 원래 알고 있던 비밀번호로 사물함을 열어 물건을 가져가는 것과 비슷합니다. 자물쇠(세션 ID)는 그대로인데 주인이 바뀌는 셈입니다.
동작 원리와 공격 시나리오
일반적인 공격 흐름은 다음과 같습니다.
- 공격자가 로그인 전 상태에서 서버로부터 세션 ID를 발급받습니다.
- 공격자가 이 세션 ID를 URL 파라미터나 쿠키 삽입 방식으로 피해자에게 전달합니다. 예를 들어
http://example.com/login?sessionid=abc123같은 링크를 클릭하도록 유도합니다. - 피해자가 해당 링크로 접속해 정상적으로 로그인을 진행합니다.
- 서버가 로그인 성공 후에도 기존 세션 ID(
abc123)를 그대로 유지하면, 공격자는 자신이 알고 있는 이 세션 ID로 피해자의 인증된 세션에 접근할 수 있게 됩니다.
핵심 취약점은 ‘로그인 전과 후에 세션 ID가 바뀌지 않는다’는 점입니다. 서버가 사용자를 새로 인증했음에도 기존 세션을 재사용하면 이런 공격이 성립합니다.
실무에서 왜 알아야 하는지
이 공격을 막는 가장 핵심적인 대응은 로그인 성공 시점에 세션 ID를 반드시 재발급하는 것입니다. 대부분의 웹 프레임워크는 로그인 처리 후 session.regenerate()와 유사한 메서드를 제공하므로, 인증 로직에서 이를 명시적으로 호출하는 습관이 중요합니다. 또한 세션 ID를 URL에 노출하지 않고 쿠키로만 관리하며, HttpOnly와 Secure 속성을 설정해 스크립트나 네트워크를 통한 탈취 가능성도 함께 줄여야 합니다.
세션 고정 공격은 XSS나 피싱과 결합되면 더 위협적으로 작용할 수 있어, 단순히 세션 관리 로직 하나를 놓쳤을 뿐인데 전체 인증 시스템의 신뢰성이 무너질 수 있습니다. 개발 단계에서 ‘로그인 전후 세션 ID가 동일한가’를 점검하는 것만으로도 실질적인 보안 수준을 크게 높일 수 있습니다.