블로그

세션 하이재킹 공격을 예방하는 2단계 인증의 작동 원리

Table of Contents

서론: “세션을 빼앗긴다”는 말이 의미하는 것

‘세션 하이재킹(Session Hijacking)’은 로그인 자체를 뚫기보다, 로그인 이후에 서버가 “이 사용자는 인증된 상태”라고 믿게 만드는 세션 정보를 가로채 악용하는 공격 흐름을 말합니다. 사용자는 비밀번호를 잘 관리했다고 생각하는데도, 어느 순간 계정이 다른 곳에서 사용되는 것처럼 보일 수 있어요. 따라서 많은 서비스가 2단계 인증(2FA)을 “추가 잠금장치”처럼 붙이지만, 구체적으로는 세션을 다루는 방식과 결합될 때 효과가 갈립니다. 이 글은 2FA가 세션 하이재킹을 어떻게 줄이는지, 그리고 어떤 조건에서 한계가 생기는지 작동 원리 중심으로 정리합니다.

어두운 사이버 화면의 로그인창에서 그림자 손이 빛나는 토큰을 훔치고, 깨진 자물쇠 아이콘이 대비되는 모습이다

1) 세션 하이재킹과 2FA가 만나는 지점

세션이란 무엇이고, 왜 공격 표적이 되는가

웹 서비스는 보통 로그인에 성공하면 서버가 세션을 만들고, 그 세션을 식별하는 값(대개 세션 쿠키나 토큰)을 브라우저에 내려줍니다. 이후 사용자는 매 요청마다 그 값을 함께 보내면서 “로그인된 사용자”로 처리됩니다. 문제는 비밀번호가 아니라 이 세션 식별값을 누가 손에 넣느냐가 핵심이 되는 순간이 있다는 점입니다. 공격자는 그 값을 복제해 자신이 가진 브라우저에서 재사용함으로써, 비밀번호를 몰라도 같은 사용자처럼 행동하려고 합니다.

세션 하이재킹이 실제로 일어나는 대표 경로

가장 흔한 경로는 네트워크 도청(HTTPS 미사용 또는 잘못된 구성), 악성 스크립트에 의한 쿠키 탈취(XSS), 악성 확장 프로그램, 감염된 단말, 피싱을 통한 토큰/쿠키 유출 같은 방식입니다. 특히 XSS는 “브라우저 안에서” 공격 코드가 실행되기 때문에 쿠키 접근. 요청 위조, 화면 조작까지 이어질 수 있어 방어가 까다롭습니다. 또 사용자가 공용 PC에서 로그아웃을 하지 않거나, 세션이 오래 유지되는 설정도 공격 성공률을 올립니다. 즉, 세션 하이재킹은 단순히 ‘해킹’이라기보다 운영 설정과 사용자 환경이 함께 만드는 사고에 가깝습니다.

2단계 인증이 막는 것은 ‘로그인’인가, ‘세션 사용’인가

2FA는 기본적으로 “새로운 인증 시도”를 강화합니다. 비밀번호가 유출돼도, 추가 인증 수단(OTP, 푸시 승인, 보안키 등)이 없으면 로그인 과정이 끝나지 않게 만드는 구조죠. 그런데 세션 하이재킹은 로그인 과정을 우회해 “이미 만들어진 세션”을 재사용하려는 공격입니다. 그래서 2FA가 세션 하이재킹을 완전히 차단한다고 단정할 수는 없고, 2FA가 어떤 방식으로 세션 발급·재발급·검증 흐름과 연결되는지가 핵심이 됩니다.

2) 2단계 인증의 작동 원리: 세션 관점에서 다시 보기

1차 인증과 2차 인증은 서버에서 어떻게 분리되는가

일반적인 로그인 흐름은 “아이디/비밀번호 확인(1차)” 후 “추가 인증(2차)”을 거쳐 최종적으로 세션을 발급하는 형태로 설계합니다. 중요한 포인트는 1차 인증이 성공해도 곧바로 ‘완전한 로그인 세션’을 주지 않는다는 점입니다. 서버는 이 상태를 ‘부분 인증(Partial Authentication)’ 혹은 ‘2FA 대기 상태’로 두고, 제한된 임시 토큰이나 짧은 수명의 상태값만 부여합니다. 그리고 2차 인증까지 통과해야만 권한이 온전한 세션(또는 액세스 토큰)을 발급합니다.

“부분 세션”과 “완전 세션”을 나누는 이유

부분 세션은 말 그대로 “비밀번호는 맞았지만 아직 최종 사용자임이 확인되지 않은 상태”를 표현합니다. 이때 서버는 계정 정보 조회, 개인정보 접근, 결제 같은 민감 기능을 막고, 2차 인증 화면으로만 이동하도록 제약을 둡니다. 만약 공격자가 비밀번호를 알아냈더라도, 이 임시 상태값만으로는 계정 활동이 불가능하게 만드는 것이죠, 세션 하이재킹 관점에서는 “탈취해도 쓸모가 낮은 값”을 중간 단계에서 쓰도록 설계하는 것이 방어의 한 축이 됩니다.

OTP(일회용 비밀번호) 기반 2FA가 세션을 강화하는 방식

TOTP 같은 OTP는 서버와 사용자 단말이 공유한 비밀키를 기반으로, 짧은 시간 창에서만 유효한 코드를 생성합니다. 서버는 사용자가 입력한 코드를 검증한 뒤에야 최종 세션을 발급하거나, 기존 세션의 권한 레벨을 올립니다. 여기서 핵심은 “최종 세션 발급 시점이 늦춰진다”는 점입니다. 공격자가 네트워크나 로그에서 비밀번호를 확보해도, OTP를 동시에 얻지 못하면 완전 세션을 만들 수 없고, 세션 하이재킹의 출발점 자체가 줄어듭니다.

푸시 승인(앱 알림) 방식 2FA가 추가로 제공하는 신호

푸시 기반 2FA는 단순히 코드를 입력하는 것보다, “사용자가 실제로 승인 버튼을 눌렀는지”라는 상호작용 신호를 더합니다. 서비스는 승인 요청을 보낼 때 기기 정보, 위치, 로그인 시도 환경 같은 메타데이터를 함께 보여주기도 합니다. 사용자는 “내가 시도한 게 맞나?”를 즉시 판단할 수 있고, 이상하면 거절할 수 있죠. 세션 하이재킹 자체를 직접적으로 막는다기보다, 세션이 발급되기 전 단계에서 의심스러운 로그인 시도를 걸러내는 역할이 강합니다.

3) 세션 하이재킹 예방에 2FA가 실제로 기여하는 지점

세션 발급 이전 공격(자격 증명 탈취)에는 강하게 작동한다

비밀번호 재사용, 피싱, 키로거 등으로 1차 인증 정보가 유출되는 상황에서는 2FA가 방어 효과를 크게 냅니다. 공격자는 계정/비밀번호를 알아도 2차 인증을 통과해야만 최종 세션을 얻을 수 있기 때문입니다. 이때 서버는 “2FA 완료”라는 상태를 세션에 태그처럼 남기고, 그 태그가 없는 요청은 민감 기능을 거부합니다. 결과적으로 세션 하이재킹의 전 단계인 ‘세션 발급 자체’를 어렵게 만들어 피해 가능성을 낮춥니다.

“재인증 요구”가 붙는 순간, 탈취 세션의 수명이 짧아진다

많은 서비스는 로그인 후에도 특정 조건에서 2FA를 다시 요구합니다. 구체적으로 새 기기, 새 브라우저, IP/국가 변경, 짧은 시간에 반복 실패, 민감 기능 접근(비밀번호 변경, 출금, API 키 발급) 같은 상황이죠. 이 구조는 공격자가 세션을 훔쳐도 마음대로 오래 쓰지 못하게 만드는 장치로 작동합니다. 즉, 2FA가 단발성 관문이 아니라 “세션 생애주기 중간중간에 끼어드는 확인 절차”로 배치될 때 세션 하이재킹 억제력이 커집니다.

세션 고정(Session Fixation) 방지와 2FA의 결합

세션 고정은 공격자가 미리 알고 있는 세션 ID를 피해자에게 쓰게 만든 뒤, 피해자가 로그인하면 그 세션을 그대로 탈취해 사용하는 방식입니다. 이때 중요한 방어는 “로그인 성공 시 세션 ID를 재발급(rotate)하는 것”입니다. 2FA가 있는 환경에서는 1차 인증 성공 시점과 2차 인증 성공 시점 모두에서 세션을 재발급하도록 설계하는 경우가 많습니다. 이렇게 하면 중간 단계에서 세션이 바뀌어 공격자가 고정해둔 값이 무력화될 가능성이 높아집니다.

어두운 네온 네트워크 배경에 해커와 스마트폰, 2단계 코드와 쿠키 탈취 광선이 교차한 모습이다

‘기기 신뢰(remember device)’ 기능이 세션 정책과 맞물리는 방식

2FA를 쓰다 보면 “이 기기에서는 30일간 2FA 생략” 같은 옵션이 등장합니다. 사용성은 좋아지지만, 세션 하이재킹 관점에서는 신뢰 쿠키(remember-me 쿠키)나 장기 토큰이 새로운 공격 표면이 됩니다. 안전한 서비스는 이 신뢰 정보를 단순 쿠키 하나로 끝내지 않고, 서버 측에서도 기기 지문/토큰 목록을 관리하며 철회(revoke) 가능하게 둡니다. 사용자는 편의 기능을 켜더라도, 계정 설정에서 ‘로그인된 기기/세션’ 목록을 확인하고 필요 시 종료할 수 있어야 흐름이 안정됩니다.

4) 2FA가 있어도 세션 하이재킹이 가능한 경우와 보완 흐름

세션 쿠키 자체가 탈취되면 2FA가 “이미 지난 단계”가 될 수 있다

가장 많이 오해하는 지점이 여기입니다. 공격자가 완전한 세션 쿠키를 탈취하면 서버 입장에서는 그 요청이 이미 2FA를 통과한 세션으로 보일 수 있는데, 이 현상은 위험 감수 행동을 유발하는 도파민 시스템과 스트레스 호르몬의 복합 작용처럼 단일 방어 수단에 대한 과신이 판단을 흐리게 만드는 구조와 닮아 있습니다. 즉 2FA는 로그인 단계에서는 강력하지만 세션이 탈취된 이후의 재사용까지 자동으로 막아주지는 않습니다. 그래서 세션 하이재킹을 줄이려면 2FA뿐 아니라 쿠키 보호 설정(HttpOnly, Secure, SameSite), TLS 강제, XSS 방어, 세션 만료 정책 같은 기본기가 함께 갖춰져야 합니다.

피싱이 2FA까지 중계하는 ‘실시간 피싱’은 어떻게 통과하는가

일부 공격은 사용자가 입력한 비밀번호와 OTP를 실시간으로 중계해 정상 로그인에 성공한 뒤, 세션을 가져갑니다. 사용자는 OTP를 입력했으니 안전하다고 느끼지만, 실제로는 공격자가 그 순간에 세션을 발급받아버리는 구조입니다. 이런 유형은 “코드 입력형 2FA”가 취약해질 수 있고, 도메인 바인딩이 되는 방식이 더 유리합니다, 그래서 보안키(fido2/webauthn)나 앱 기반 승인에서 ‘요청 출처’가 명확히 보이도록 설계하는 흐름이 중요해집니다.

FIDO2/WebAuthn(보안키)이 세션 하이재킹에 더 강한 이유

보안키 기반 인증은 사이트의 도메인(리라잉 파티)과 묶여 동작하는 공개키 기반 구조를 사용합니다. 사용자가 가짜 사이트에 속아도, 보안키는 그 도메인에 대한 서명을 생성하지 않기 때문에 피싱 중계가 어려워집니다. 결과적으로 공격자가 “정상 세션을 발급받는 것” 자체가 까다로워지고, 세션 하이재킹의 시작점이 줄어듭니다. 그러나 로그인 이후 세션 쿠키가 탈취되는 문제는 별개이므로, 여전히 세션 보호 정책과 함께 가야 합니다.

운영 측면에서 자주 쓰는 보완책: 세션 바인딩과 이상 징후 감지

서비스는 세션을 발급할 때 사용자 환경 정보를 함께 묶어두기도 합니다, 예를 들어 ip 대역, 사용자 에이전트, 기기 특성 같은 신호를 저장해두고 갑작스럽게 바뀌면 재인증을 요구하는 방식입니다. 이를 ‘세션 바인딩’ 또는 ‘리스크 기반 인증’이라고 부르며, 2FA와 결합하면 효과가 커집니다. 다만 이동통신 환경처럼 IP가 자주 바뀌는 사용자도 있어, 과도하게 적용하면 오탐으로 불편이 생길 수 있다는 점은 운영에서 늘 조정 포인트가 됩니다.

사용자 관점에서 바로 적용되는 실용 체크리스트

사용자가 할 수 있는 것은 의외로 단순합니다. 먼저 2FA를 켜되, 가능하면 보안키나 앱 승인처럼 피싱 저항성이 높은 방식을 우선 고려하는 편이 안전합니다. 다음으로 “로그인된 기기/세션 보기” 메뉴가 있는 서비스라면 주기적으로 확인하고, 낯선 세션은 종료하는 습관이 도움이 됩니다, 마지막으로 공용 pc 사용 후 로그아웃, 브라우저 확장 프로그램 정리, os/브라우저 업데이트 같은 기본 관리가 세션 탈취 경로를 줄이는 데 직접적으로 연결됩니다.

커뮤니티·참여형 서비스에서 특히 중요한 ‘신뢰 판단’ 흐름

참여형 서비스는 로그인 상태에서 글쓰기, 포인트 적립, 메시지 발송 같은 활동이 이어지는 경우가 많습니다. 세션이 탈취되면 단순 접속이 아니라 “내 이름으로 활동 기록이 남는” 형태로 피해가 커질 수 있죠. 그래서 운영자는 2FA 도입과 함께, 활동 패턴 이상 감지나 민감 기능 재인증을 붙여 신뢰를 보강합니다, 사용자도 알림(새 기기 로그인, 비밀번호 변경 시도)을 켜두면 ‘내 계정이 나 대신 움직이는지’ 빠르게 판단할 단서가 생깁니다.

결론: 2FA는 ‘세션을 못 훔치게’가 아니라 ‘세션을 쉽게 못 만들게’에서 출발한다

2단계 인증은 세션 하이재킹을 한 번에 봉쇄하는 만능 열쇠라기보다, 공격자가 정상 세션을 발급받는 과정을 어렵게 만드는 장치에 가깝습니다, 특히 비밀번호 유출이나 단순 피싱처럼 “로그인 단계”에서 끝나는 공격에는 매우 강하게 작동하고, 재인증 요구나 세션 재발급 같은 운영 정책과 결합되면 세션 탈취의 피해 범위를 줄이는 데도 도움이 됩니다. 반대로 완전 세션 쿠키가 이미 탈취된 상황에서는 2FA가 뒤늦을 수 있으니, 쿠키 보호·XSS 방어·만료 정책·세션 관리 기능이 함께 갖춰져야 흐름이 완성됩니다. 결국 사용자는 2FA를 켜는 것에서 멈추지 말고, 어떤 방식의 2FA인지와 세션 관리 메뉴까지 함께 확인하는 관점으로 접근하는 편이 안전합니다.