1. 왜 FIDO2·WebAuthn·Passkey인가 — SMS OTP의 종말
패스워드 + SMS OTP는 피싱·SIM 스왑·MitM·OTP-Bot에 모두 취약. Microsoft 2024 보고서: MFA 우회 공격(AiTM·Adversary-in-the-Middle) 분당 1,000+ 시도, SMS OTP 우회 성공률 30%+. 미국 NIST SP 800-63B(개정 6, 2024.8)는 SMS 기반 OTP를 Restricted(권장 X) 분류, Phishing-Resistant MFA 의무화 권고.
FIDO Alliance — 2012년 설립, Apple·Google·Microsoft·Samsung 등 250+ 회원. FIDO2 = WebAuthn(W3C 표준, 2019.3) + CTAP2(Client-to-Authenticator Protocol). 공개키 암호 기반 — RP(Relying Party)는 공개키만 보관, 사용자 디바이스가 비밀키 보유. 피싱 불가능: 인증 시 도메인 원본(origin) 검증 → 위조 도메인에서는 작동 X.
Passkey(2022.5 발표, 2024.2 W3C·FIDO 정식 표준) — FIDO2 자격증명을 디바이스 간 동기화(iCloud·Google Password Manager·Microsoft Authenticator)하거나 QR로 다른 디바이스에 임시 사용. Apple Sign-in with Passkey(2022.10), Google(2023.5), Microsoft(2024.5) 전면 지원.
법적 압박: 미국 EO 14028·OMB M-22-09 연방기관 피싱방지 MFA 의무, EU PSD2 SCA(Strong Customer Authentication) 의무, EU CRA 디지털제품 인증 강화, 한국 행안부 패스워드리스 인증 가이드라인(2024.5) — 공공기관 단계 적용, 금융권 ISMS-P·전자금융감독규정 강화.
2. FIDO 표준 진화·성숙도
| 표준 | 발표 | 특징 |
|---|---|---|
| FIDO U2F (CTAP1) | 2014 | 보조 인증(패스워드 + USB Key) |
| FIDO UAF | 2014 | 모바일 패스워드리스 |
| FIDO2 (WebAuthn + CTAP2) | 2019 | 웹 패스워드리스, Roaming + Platform |
| Passkey (Multi-device) | 2022 | 동기화 자격증명, 디바이스 간 |
| Device-bound Passkey | 2024 | 하드웨어 결속, 최고 보증 (AAL3) |
| Cross-device QR + BLE | 2023 | 다른 디바이스 임시 사용 |
Authenticator 종류:
- Roaming Authenticator: USB·NFC·BLE 보안키 (YubiKey, Google Titan, Feitian)
- Platform Authenticator: 디바이스 내장 (Touch ID, Face ID, Windows Hello, Android 지문)
Attestation 모드:
- None: 검증 없음 (B2C·일반)
- Indirect: 익명화 (배치 인증서)
- Direct: 제조사·모델 직접 (정부·금융)
- Enterprise: 시리얼 번호까지 (군·핵·항공)
3. 핵심 컴포넌트·동작 흐름
컴포넌트 4개:
- Relying Party(RP): 서비스(웹사이트·앱) —
rp.id= 도메인 - WebAuthn API: 브라우저(Chrome·Safari·Firefox·Edge) 노출 JS API
- Client(CTAP2): OS·브라우저 — Authenticator와 통신
- Authenticator: 키 생성·저장·서명 (Platform 또는 Roaming)
등록(Registration) 흐름:
- RP가
challenge생성·전송 - 브라우저
navigator.credentials.create()호출 - Authenticator가 키 쌍 생성, 비밀키 보관, 공개키 + Attestation 반환
- RP가 검증 후 사용자 ID와 공개키 매핑 저장
인증(Authentication) 흐름:
- RP가
challenge생성 - 브라우저
navigator.credentials.get()호출 - Authenticator가 사용자 검증(생체·PIN) 후 비밀키로 서명
- RP가 공개키로 서명 검증·세션 발급
4. Stage 1 — 현황 진단·파일럿 (1~2개월)
현황 진단:
- 현재 인증 방식 매핑 — 패스워드·SMS OTP·OTP 앱(TOTP)·하드웨어 OTP·이메일 매직링크
- 사용자 분류 — 직원(IAM) / 고객(B2C) / 파트너(B2B)
- 디바이스 분포 — Windows·Mac·iOS·Android·Linux 비율
- 브라우저 분포 — Chrome·Safari·Edge·Firefox (대부분 FIDO2 지원, IE 미지원)
- 컴플라이언스 요구 — EO 14028·PSD2·ISMS-P·CMMC
파일럿 시나리오:
- 소규모 그룹(임직원 10
50명) Roaming Key (YubiKey 5C NFC 평균 710만원) 발급 - 또는 Platform Authenticator만(Touch ID·Windows Hello)
- 6~8주 운영 후 사용성·문제점 수집
RP 라이브러리 선택:
- Node.js:
@simplewebauthn/server(가장 활성) - Java:
webauthn4j,Yubico java-webauthn-server - Python:
py_webauthn - Go:
go-webauthn/webauthn - .NET:
Fido2NetLib - PHP:
web-auth/webauthn-lib
5. Stage 2 — IdP·SSO 통합 (2~4개월)
IdP가 FIDO2를 지원하면 직접 구현 없이 적용 가능 — 보통 권장.
주요 IdP 지원:
- Microsoft Entra ID(Azure AD): FIDO2 Security Key(2019~), Passkey Preview(2024~), Windows Hello for Business 통합
- Okta: WebAuthn(2019~), Okta FastPass(2023~) 자체 Passkey
- Google Workspace: 보안 키 + Passkey(2023~)
- Ping Identity: PingOne MFA Passkey
- ForgeRock: WebAuthn 노드
- Auth0: Customer Identity Passkey
- AWS IAM Identity Center: FIDO2(2024.4)
도입 순서:
- 고권한 사용자 우선: Admin·CISO·재무·인사 → Roaming Key 의무
- 일반 직원 단계 확대 — Platform Authenticator 활용
- B2B 파트너 포털 — 외주·협력업체 FIDO2 강제
- B2C 고객 — Passkey 우선(친숙도·디바이스 결속 X)
기존 시스템 점진 교체:
- 모든 SaaS는 SSO(SAML·OIDC) → IdP 통합 → 한 곳에서 FIDO2 적용
- 레거시 앱은 IdP Federation Gateway·헤더 인증으로 우회
6. Stage 3 — 자체 RP 구현 (필요 시) (3~6개월)
자체 구현 필요 케이스: IdP 미사용, 고객 직접 인증, 특수 요구.
WebAuthn Server 구현 핵심:
// Node.js + SimpleWebAuthn 예시
import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';
// 등록 옵션 생성
const options = await generateRegistrationOptions({
rpName: 'CONTIS',
rpID: 'contis.co.kr',
userID: Buffer.from(user.id),
userName: user.email,
attestationType: 'none',
authenticatorSelection: {
residentKey: 'required', // Passkey (discoverable)
userVerification: 'required', // 생체·PIN 강제
authenticatorAttachment: 'platform' // 또는 'cross-platform'
},
excludeCredentials: existingCredentials,
});
// challenge를 세션에 저장
// 클라이언트로 options 전송
// 응답 검증
const verification = await verifyRegistrationResponse({
response: clientResponse,
expectedChallenge: session.challenge,
expectedOrigin: 'https://contis.co.kr',
expectedRPID: 'contis.co.kr',
});
if (verification.verified) {
await db.credentials.create({
userId: user.id,
credentialID: verification.registrationInfo.credentialID,
publicKey: verification.registrationInfo.credentialPublicKey,
counter: verification.registrationInfo.counter,
transports: clientResponse.response.transports,
});
}
클라이언트(브라우저):
const cred = await navigator.credentials.create({ publicKey: options });
// cred를 서버 전송
중요 보안 체크:
origin검증 (서버에서 expected와 일치)rpIDhash 검증 (Authenticator Data의 RP ID Hash)counter(signature counter) 증가 검증 — 복제 탐지- User Verification(
UV) 비트 확인 — 생체·PIN 사용 강제 - Attestation 검증(필요 시) — FIDO Metadata Service(MDS) 활용
FIDO Metadata Service(MDS): 인증된 Authenticator 모델·취약점 DB 무료 제공, RP는 알려진 취약 모델 차단 가능.
7. Stage 4 — Passkey 전환·UX 최적화 (4~6개월)
Passkey 도입 전략:
- Synced Passkey: 디바이스 간 동기화(iCloud·Google) — 사용성 최고, 복구 쉬움 — 일반 사용자
- Device-bound Passkey: 디바이스 결속 — 최고 보안 — Admin·금융
복구·이전 시나리오:
- 디바이스 분실 — Passkey 동기화로 자동 복구
- 모든 디바이스 분실 — 백업 코드·이메일·전화 복구 (취약점 — 별도 강력 통제)
- 신규 디바이스 등록 — 기존 디바이스로 QR 인증 또는 백업 코드
Conditional UI (Passkey Autofill):
- 로그인 페이지에 자동 Passkey 제안
- iOS Safari·Android Chrome 지원
- ID 입력 없이 디바이스 선택 → 생체 인증 → 로그인
Hybrid Transport (Cross-device):
- 데스크탑에 모바일 Passkey 사용 — QR 코드 + BLE 근접 확인
- iPhone Passkey로 Windows Chrome 로그인 가능
UX 주의:
- “Passkey를 만들까요?” 너무 일찍 띄우면 거부
- 로그인 성공 시 또는 보안 설정 페이지에서 권유
- 분실 대비 백업 인증 수단 1개 이상 유지
- 명확한 라벨 — “지문으로 더 빠르게 로그인” 등
8. Stage 5 — AAL3·고도화·NIST 800-63B (지속)
NIST SP 800-63B AAL3 (최고 보증 수준):
- Hardware-based Authenticator + Verifier Impersonation Resistance
- = Device-bound FIDO2 Security Key (Synced Passkey는 AAL2)
- 정부 핵심 시스템·금융 거래 일정 금액 이상 적용
Verifier Impersonation Resistance:
- FIDO2는 origin·RP ID 검증으로 본질적으로 충족
- SMS OTP·TOTP는 미충족
Phishing-Resistant MFA 인증된 Authenticator:
- FIDO2 Security Key
- Smart Card (PIV·CAC)
- Windows Hello for Business (Hardware-backed)
- 비고: TOTP·Push 인증은 피싱 가능
고도화:
- Continuous Authentication: 세션 중 행동 분석·디바이스 상태 추가 검증
- Risk-based Authentication: 위험 점수에 따라 추가 인증 요구
- CIBA(Client-Initiated Backchannel Authentication): 콜센터·POS·키오스크에서 푸시 인증
거버넌스:
- Passkey 정책 문서 — 등록·복구·이전·해지
- 사용자 교육 — 분기 1회 보안 알림
- 분기 KPI — Passkey 등록률·MFA 우회 시도·Key 분실률
9. 비용·ROI
| 항목 | 비용 |
|---|---|
| YubiKey 5C NFC(직원당) | 7 |
| Microsoft Entra ID P1 (직원당/월) | $6 (FIDO2 포함) |
| Auth0 Customer Passkey | $0.023~/MAU |
| 자체 구현 — 개발(2~6개월) | 3천만~3억 |
| 사용자 교육·전환 캠페인 | 1천~5천만 |
| 합계 (직원 100명) | 3천~3억(연) + 키 비용 |
ROI:
- 피싱 100% 차단 (origin 검증) — 평균 피싱 손실 한국 평균 30~50억(IBM 2024)
- 패스워드 재설정 헬프데스크 비용 절감 — Forrester $70/회, 평균 25% 감소
- SMS OTP 비용 0 — 연간 수천만원 SMS 비용 제거
- 로그인 시간 50%+ 단축 → 생산성 향상
- 사이버보험 피싱방지 MFA 도입 시 15~25% 할인
- ISMS-P·EU CRA·PSD2 동시 충족 — 컴플라이언스 비용 절감
10. 자가 점검 — FIDO2·Passkey 도입 상태
- 현재 인증 방식 매핑(패스워드·SMS·TOTP·FIDO2 비율)
- NIST AAL 수준 정의(고권한 = AAL3, 일반 = AAL2)
- 컴플라이언스 요구 분석(EO 14028·PSD2·ISMS-P·CMMC)
- IdP FIDO2 지원 확인(Entra ID·Okta·Auth0 등)
- 파일럿 그룹 운영(임원·IT·재무)
- 고권한 Roaming Key 의무화
- 일반 직원 Platform Authenticator
- B2C Passkey UX 통합
- Conditional UI / Autofill
- 분실·복구 절차 문서화
- FIDO MDS 통합 — 취약 모델 차단
- origin·counter·UV 검증 확인
- SMS OTP 폐지 로드맵
- 사용자 교육 분기
- KPI — 등록률·MFA 우회·키 분실
- Risk-based·Continuous Auth 검토
11. 마무리 — 패스워드 시대의 종말
FIDO2·WebAuthn·Passkey는 ① 현황 진단·파일럿, ② IdP 통합, ③ 자체 RP 구현(필요 시), ④ Passkey 전환·UX 최적화, ⑤ AAL3·고도화 — 5단계로 점진 도입한다. 패스워드는 향후 10년 내 사라질 운명, 지금 도입하면 피싱·SMS 우회·랜섬웨어 초기 침투 90%+ 차단, ISMS-P·EU CRA·PSD2·EO 14028 자동 충족된다.
