2단계 인증은 피싱을 막지 못한다

2FA는 크리덴셜 스터핑을 막는다. 2026년에 실제로 세션을 훔치는 실시간 피싱 프록시는 거의 늦추지도 못한다.

2단계 인증은 피싱 해결책이 아니다.

패스워드 실패 해결책이다.

같은 문제가 아닌데 업계가 계속 같은 것처럼 행동한다. “2FA를 켜세요”는 체크리스트에 깔끔하게 들어가고, “피싱 방지 암호학 기반으로 로그인을 재설계하세요”는 안 들어가니까. TOTP를 배포하고, 축하 전사 이메일을 보내고, 피싱 챕터가 끝난 것처럼 행동하는 조직을 너무 많이 봤다.

끝나지 않았다. 크리덴셜 스터핑을 어렵게 만들었을 뿐이다.

실시간 피싱 프록시의 작동 방식

2026년의 피싱은 비밀번호를 추측하지 않는다. 로그인을 브루트포스하지도 않는다. 당신과 실제 웹사이트 사이에 앉아서 모든 것을 — 2단계 인증 코드까지 — 실시간으로 중계한다.

이메일이 온다. 정상적으로 보인다. 링크를 클릭한다. 피싱 페이지는 크리덴셜을 저장하는 게 아니라 실제 사이트로 실시간 전달한다. 실제 사이트가 2FA 프롬프트를 보낸다. 피싱 페이지가 그 프롬프트를 보여준다. 6자리 코드를 입력한다. 프록시가 전달한다. 실제 사이트가 검증하고 세션 쿠키를 발급한다.

공격자가 이제 세션 쿠키를 갖고 있다. 패스워드도 더 이상 필요 없다. 코드도 필요 없다. 세션을 가졌다. 들어왔다.

전체 과정이 정상적으로 느껴진다. 로그인했고, 코드 입력했고, 대시보드를 봤다. 다 작동했다. 모든 패킷이 프록시를 거쳤다는 걸 전혀 모른다.

이걸 위한 도구들 — Evilginx, Modlishka, Muraena — 은 공개되어 있고, 문서화가 잘 되어 있고, 적극적으로 유지보수된다. 세팅하는 데 한 시간도 안 걸린다. 레포를 클론하고 셋업 스크립트를 실행하면 유효한 HTTPS를 갖춘 완전한 세션 탈취 프록시가 생긴다.

쿠키가 상품이다

비전문가들이 놓치는 부분이다.

세션이 수립되면 공격자가 패스워드에 항상 관심 있는 건 아니다. Microsoft가 인시던트 대응 보고서에서 직설적으로 말했다: 중간자 피싱은 이미 MFA를 만족시킨 토큰을 훔친다. 세션 쿠키가 공격자 브라우저에 임포트되면 서비스는 인증된 세션을 본다. MFA는 이미 끝났다. 문은 열렸다.

표적 피싱이 “MFA가 있었는데 어떻게 들어왔어?”로 보이는 이유다.

2FA가 실제로 막는 것

공평하게 — 2FA는 크리덴셜 스터핑을 확실히 죽인다. 누가 유출된 크리덴셜로 50개 서비스에 시도? TOTP가 막는다. 브루트포스? 막는다. 패스워드를 캡처해서 나중에 쓰는 기본 피싱? 막는다.

실제 공격이다. 끊임없이 일어난다. 유출 패스워드 시도만 걱정하면 된다면 2FA가 완전한 해결책이다.

근데 밤에 잠 못 들게 하는 위협 모델이 그게 아니다.

푸시 기반 MFA도 크게 다르지 않다

Microsoft Authenticator나 Duo의 “로그인 승인” 푸시 알림은 프록시하기가 약간 더 어렵다. 하지만 MFA 피로 — 사용자가 짜증에 하나를 승인할 때까지 푸시 요청을 폭격 — 는 문서화되고 효과적인 기법이다. 2022년 Uber 침해가 정확히 이 방법을 썼다.

일부 제공자는 이제 숫자 매칭을 요구한다. 도움이 된다. 하지만 잘 만든 프록시는 숫자 매칭 챌린지도 중계할 수 있다.

모든 2단계 인증이 같지 않다

TOTP 코드와 SMS 코드는 코드와 특정 사이트 사이에 바인딩이 없어서 취약하다. 코드는 30-60초간 유효하고, 프록시는 밀리초 안에 전달한다.

FIDO2/WebAuthn을 쓰는 하드웨어 보안 키는 다르다. YubiKey를 탭하거나 플랫폼 인증기 — Touch ID, Windows Hello — 를 쓸 때, 브라우저가 오리진을 암호화 챌린지에 포함시킨다. real-bank.com 대신 phishing-bank.com에 있으면 챌린지가 잘못된 오리진에 바인딩된다. 인증이 실패한다. 프록시가 중계할 수 없다. 암호화 증명이 실제 사이트에 묶여 있기 때문이다.

오리진 바인딩이다. 피싱 프록시를 구조적으로 무력화하는 유일한 형태의 2FA. 가로채기가 더 어려워서가 아니라 — 다른 오리진에 재생하는 것이 수학적으로 불가능해서다.

왜 다들 하드웨어 키를 안 쓰나

비용. YubiKey가 $25-50이다. 직원 전원에 곱하고, 백업 추가하고, 분실 교체분 추가하면.

UX. 키가 물리적으로 있어야 한다. 잃어버리면? 잠김. 집에 두고 오면? 로그인 불가. 플랫폼 인증기가 물리 문제를 풀지만 디바이스 바인딩 문제를 만든다.

생태계 격차. 모든 사이트가 FIDO2를 지원하지 않는다. 3개 계정은 하드웨어 키, 나머지 12개는 TOTP. TOTP 계정이 약한 링크로 남는다.

그리고 메시징 문제. “2FA를 켜세요”는 간단한 조언이다. “FIDO2 기반 2FA를 켜세요, 하드웨어 키나 플랫폼 인증기가 필요하고, WebAuthn을 지원하는 사이트에서만 보호되는데 전부는 아닙니다”는 포스터에 안 들어간다.

거짓 자신감 문제

2FA를 과대 판매했다. 벽이라고 믿게 했는데 실은 과속 방지턱이다. 대부분 공격에 대해서는 상당한 과속 방지턱. 표적 프록시 피싱에 대해서는 무시할 수 있는 수준.

2FA를 켠 사람들은 피싱 걱정을 멈췄다. “2FA 있으니까 안전해.” 그 거짓 자신감이 어떤 면에서는 2FA 없는 것보다 더 위험하다. 행동을 바꾸니까. 클릭하면 안 되는 링크를 클릭하고, 믿으면 안 되는 페이지에 크리덴셜을 입력한다. 2단계가 안전망이라고 믿으니까.

아니다. 가장 중요한 공격에 대해서는 안전망이 아니다. 2단계 인증은 대부분의 사람이 생각하는 것을 하지 않는 필수 레이어다. 패스워드만 쓰는 것보다 낫다. 만들어내는 자신감보다는 못하다.

토론 참여

← 블로그로 돌아가기