본문 바로가기
system_fundamentals/security_cryptography

FIDO/WebAuthn

by 죄니안죄니 2026. 5. 18.
반응형

FIDO/WebAuthn은
요즘 패스키(Passkey), Face ID 로그인, Windows Hello 로그인 같은 것들의 핵심 기술

즉:

비밀번호 대신
공개키 암호 기반으로 로그인하자
 

라는 방향.


먼저 관계 정리

 

FIDO

큰 개념/표준 연합.

만든 곳:

  • FIDO Alliance

WebAuthn

브라우저 표준 API.

즉:

브라우저가
FIDO 인증 기능 제공
 

하는 것.


쉽게 말하면

FIDO

"이런 인증 방식 쓰자"
 

표준.

WebAuthn

브라우저에서 실제 구현하는 API
 

왜 나온 건가

비밀번호의 근본적 문제 때문.

기존 비밀번호 문제

1. 서버가 비밀번호를 관리해야 함

해시 저장해도 위험.

DB 털리면 공격 가능.

2. 피싱 취약

사용자가:

가짜 사이트
 

에 비밀번호 입력 가능.

3. 재사용 문제

같은 비밀번호 여러 사이트 사용.


FIDO 목표

핵심은:

서버가 비밀번호를 몰라도 되게 하자
 

야.


핵심 원리

공개키 암호 기반

회원가입 또는 Passkey 사용 선택 시:

사용자 기기에서

공개키 / 개인키 생성
 

함.

서버에는 공개키만 저장

PUBLIC KEY
 

만 서버에 저장.

개인키는 절대 안나감

중요.

개인키는:

  • 아이폰 Secure Enclave
  • Android Keystore
  • TPM
  • 보안키(YubiKey)

같은 안전한 하드웨어 내부 보관.

 

기존 구조

USER
- email
- password_hash
 

 

Passkey 추가 후

USER
- email
- password_hash

PASSKEY_CREDENTIAL
- user_id
- credential_id
- public_key
- device_info
 

이런 느낌.


동작 과정

최초 생성시

STEP 1

현재 로그인 상태 확인.

(기존 비밀번호/MFA 기반)

STEP 2

브라우저가 WebAuthn API 호출.

 
navigator.credentials.create()
 

STEP 3

OS/기기가 키 생성.

PUBLIC KEY
PRIVATE KEY
 

STEP 4

공개키만 구글 서버 등록.

STEP 5

이후 로그인부터:

Face ID
지문
PIN
 

등으로 인증 가능.

 

로그인시

STEP 1

사이트:

"진짜 너 맞아?"
 

랜덤 challenge 생성.

STEP 2

브라우저가 사용자 인증 요청.

예:

  • 지문
  • Face ID
  • PIN

STEP 3

기기가 challenge를 개인키로 서명.

SIGN(challenge)
 

STEP 4

서버는 공개키로 검증.

아 진짜 개인키 가진 사용자네
 

판단.


왜 안전한가

핵심 3개.

1. 비밀번호 없음

서버가 비밀번호 저장 안함.

2. 개인키 유출 어려움

기기 밖으로 안나감.

3. 피싱 방어

엄청 중요.


FIDO/WebAuthn은:

현재 접속 도메인(origin)
 

을 같이 검증함.

즉:

fake-google.com
 

에서는

google.com 용 개인키 사용 불가
 

 


이게 기존 OTP보다 강한 이유

OTP는 사용자가 속아서 입력 가능.

하지만 WebAuthn은:

도메인 자체 검증
 

해서 피싱에 매우 강함.


Passkey가 뭐냐

사실상:

FIDO/WebAuthn 기반 로그인 정보
 

를 사용자 친화적으로 부르는 이름.

예:

  • 아이폰 Face ID 로그인
  • 크롬 패스키 로그인
  • Windows Hello

전부 Passkey 계열.


실사용 예시

회원가입

"Passkey 생성하시겠습니까?"
 

누름.

이후 로그인

Face ID
 

만 하면 끝.

비밀번호 없음.


WebAuthn 구조

브라우저 API 형태.

회원가입(등록)

 
navigator.credentials.create()
 

 

로그인(인증)

 
navigator.credentials.get()
 

실무 구조

Browser
↓ WebAuthn API
OS / Security Hardware
↓
Private Key Sign
↓
Server verifies with Public Key
 

서버에는 뭐 저장하나

보통:

 
{
  "credentialId": "...",
  "publicKey": "...",
  "signCount": ...
}
 

signCount 역할

재전송 공격 방지.

인증 횟수 증가값 검증.


생체정보는 서버가 안가짐

이것도 중요.

예:

  • 지문
  • 얼굴

이런 건:

기기 내부에서만 검증
 

됨.

서버는:

"인증 성공 여부"
 

만 받음.


그래서 Face ID가 안전한 이유

애플 서버가 네 얼굴 저장하는 게 아님.

기기 Secure Enclave 내부 처리.


실무에서 많이 쓰는 라이브러리

프론트

  • 브라우저 WebAuthn API

백엔드

Java

Node.js


실무 적용 방식

요즘은 보통:

1. MFA 추가수단

ID/PW + Passkey
 

 

2. Passwordless

비밀번호 제거
 

방향.

SSO와 같이 사용

예:

Keycloak + WebAuthn
 

조합.


기업에서 중요해진 이유

특히:

  • 피싱 공격
  • OTP 탈취
  • 세션 탈취

증가 때문.

그래서:

FIDO2
Passkey
Passwordless
 

가 차세대 인증 핵심 흐름 됨.


WebAuthn 지원 브라우저

거의 다 지원.

  • Google Chrome
  • Microsoft Edge
  • Safari
  • Firefox

핵심 정리

FIDO/WebAuthn은:

비밀번호 대신

기기 내부 개인키 + 공개키 암호 + 생체인증을 이용해

피싱과 비밀번호 탈취를 막는
차세대 인증 기술
 

이야.

반응형

댓글