2 min read
Passkey 도입 로드맵
기존 비밀번호/OTP 기반 인증을 Passkey로 확장할 때 필요한 단계별 전환 전략

도입
Passkey는 UX와 보안을 동시에 개선할 수 있는 수단이지만, 기존 비밀번호/OTP 생태계를 즉시 대체하기는 어렵다. 실무에서는 가입 채널, 디바이스 다양성, 복구 정책 때문에 "점진 전환"이 필수다.
이 글은 신규 가입과 기존 사용자 전환을 분리해서 운영하는 로드맵을 다룬다. 목표는 사용자 이탈 없이 보안 수준을 높이는 것이다.

문제 정의
Passkey 전환 프로젝트에서 실제로 많이 막히는 포인트:
- 등록 흐름은 잘 되는데 계정 복구 정책이 없어 CS 부하가 급증한다.
- 다중 디바이스 동기화 특성을 고려하지 않아 로그인 실패 문의가 증가한다.
- Passkey와 기존 OTP 정책의 우선순위가 모호해 보안 구멍이 생긴다.
- 신규 사용자/기존 사용자 경험을 같은 화면으로 처리해 전환율이 낮다.
핵심은 인증 수단 추가가 아니라 "인증 정책 상태 머신"을 재정의하는 것이다.
핵심 개념
| 단계 | 목표 | 정책 포인트 |
|---|---|---|
| Phase 1 | 옵트인 등록 | 기존 비밀번호 경로 유지 |
| Phase 2 | 권장 로그인 | Passkey 우선, OTP fallback |
| Phase 3 | 보안 강제 | 고위험 작업에서 Passkey 요구 |
| Phase 4 | 기본값 전환 | 신규 가입 Passkey 기본화 |
계정 복구는 항상 별도 정책으로 둔다. "기기 분실" 시나리오가 준비되지 않으면 보안보다 운영 리스크가 먼저 커진다.
코드 예시 1: 서버 등록 옵션 생성(WebAuthn)
import { generateRegistrationOptions } from "@simplewebauthn/server";
export async function createPasskeyRegistrationOptions(user: {
id: string;
email: string;
displayName: string;
}) {
return generateRegistrationOptions({
rpName: "8SPACE",
rpID: "www.8space.dev",
userID: user.id,
userName: user.email,
userDisplayName: user.displayName,
attestationType: "none",
authenticatorSelection: {
residentKey: "preferred",
userVerification: "preferred",
},
timeout: 60_000,
});
}
코드 예시 2: 인증 정책 상태 전이 예시
type AuthState = "PASSWORD_ONLY" | "PASSKEY_ENROLLED" | "PASSKEY_REQUIRED";
export function nextAuthState(params: {
current: AuthState;
hasPasskey: boolean;
riskScore: number;
}): AuthState {
if (params.current === "PASSWORD_ONLY" && params.hasPasskey) {
return "PASSKEY_ENROLLED";
}
if (params.hasPasskey && params.riskScore >= 70) {
return "PASSKEY_REQUIRED";
}
return params.current;
}
아키텍처 흐름
Mermaid diagram rendering...
트레이드오프
- Passkey 도입은 피싱 저항성을 크게 높이지만, 초기 운영 복잡도는 증가한다.
- 복구 정책을 강하게 하면 보안은 좋아지지만 사용자 마찰이 생길 수 있다.
- 단계 전환 기준을 지표화하지 않으면 "좋아 보여서 확대" 같은 감각 의사결정이 발생한다.
정리
Passkey 전환은 인증 수단 추가 프로젝트가 아니라 인증 정책 리디자인 프로젝트다. 전환 단계를 명확히 나누고, 복구 정책과 리스크 기반 강제 조건을 함께 설계하면 보안과 UX를 동시에 가져갈 수 있다.
이미지 출처
- Cover: source link
- License: Public domain / Author: U.S. government
- Note: Wikimedia Commons 무료 라이선스 이미지를 다운로드 후 1600px 기준 JPG로 최적화했습니다.