본문 바로가기

Security

FIDO와 Webauthn이란 무엇인가

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

FIDOFast IDentity Online의 약자로 사용자 인증 프로토콜에 대한 표준입니다. FIDO를 준수하는 시스템에서는 어떤 제조사가 인증키를 만들든 FIDO만 따른다면 사용가능합니다. 기본적으로 FIDO는 Challenge-response로 인증합니다. 인증키를 사용할 곳에 미리 공개키를 등록시켜두고 이후 인증할 때 challenge를 받고 개인키로 서명하여 응답하는 것으로 사용자가 인증키를 보유하고 있는 본인이라는 것을 증명하게 됩니다. 현재 최신 프로토콜 버전은 FIDO2이며 CTAP1, CTAP2라는 규격으로 나뉘어져 있습니다.

 

CTAP1은 기존의 FIDO1(FIDO)의 U2F를 의미합니다. 이 규격은 사용자가 로그인 할 때 인증키를 통해 2차 인증을 가능하게 합니다. FIDO를 통한 2차 인증을 지원하는 사이트에서는 이것이 사용됩니다. 이전 FIDO U2F가 FIDO2의 CTAP1이 된 것이므로 FIDO U2F를 사용하는 장치도 호환됩니다.

 

CTAP2는 아예 아이디나 비밀번호를 사용하지 않고 인증키만으로 인증하는 규격입니다. 그러므로 이것을 지원하는 곳에서는 단지 로그인 버튼을 누르고 FIDO 장치를 연결 후 버튼이나 지문인식을 하면 바로 인증됩니다. 기존의 FIDO UAF가 CTAP2로 명칭이 바뀐 것이지만 기본적으로 FIDO UAF만 지원하는 기기는 본 적이 없고 FIDO2 인증을 받은 경우만 지원한다고 알고 있는게 편합니다.

 

FIDO의 사용자 인증은 사용하는 인증키에 따라서 다르게 됩니다. 인증키가 지문이나 홍채인식을 사용할 수도 있고 단지 버튼을 누르기만 해도 되는 것이 있습니다. 인증키를 등록받는 쪽은 인증 방법에 대해서는 신경쓰지 않아도 되고 신경 쓸 수도 없습니다. 단지 인증키가 사용자를 검증하는지, 사람이 존재하는지 확인만 하는지만 알 수 있으므로 사용자 검증이 꼭 필요한 곳에서라면 검증 플래그가 없다면 등록이나 인증을 거부할 수는 있습니다.

 

추가적으로 Attestation이라고 해서 인증키가 FIDO alliance에서 인증받았다는 정보를 제공할 수 있습니다. Attestation을 통해서 특정 제조사에서 만든 인증키만 사용 가능하도록 시스템을 구성하는 것도 가능합니다.


Webauthn은 이 CTAP1, CTAP2를 웹 브라우저에서도 사용가능하도록 하는 API입니다. Javascript로 Webauthn을 사용하여 간단히 FIDO 장치를 사용할 수 있습니다. Webauthn이 나오기 이전에는 u2f라는 API가 사용되었으나 Webauthn이 나온 지금은 호환성을 위해 남아있는 상태이므로 앞으로는 Webauthn만 사용해야 합니다.

 

Webauthn은 CTAP2도 지원하도록 만들어져 있지만 브라우저와 운영체제에 따라 약간의 제약사항이나 사용할 수 없는 기능이 생길 수 있습니다. 예를들어 리눅스의 Firefox에서는 CTAP1을 통한 2차인증은 가능하나 CTAP2를 사용하는 resident key는 아직 미완성인 상태입니다. 안드로이드는 오직 Android SafetyNet을 통해 CTAP1 인증이 가능하며 CTAP2는 지원하지 않습니다. 다만 대부분 CTAP1에 대해서는 구현이 된 상태이므로 2차 인증은 어떤 환경에서든지 사용가능하다고 생각해도 될 것 같습니다.

 

Webauthn을 통해 2차 인증을 하게된다면 아래와 같이 브라우저에서 사용자에게 인증키 조작을 요구합니다.

사용자가 인증키를 연결하고 버튼을 누르는 등 인증을 실행했다면 인증 프로세스가 진행되고 결과가 나오게 될 것 입니다. 아래는 구글에서 인증키로 인증이 완료되었을 때 나오는 화면입니다.

 

Webauthn API 예제는 인터넷에 상당히 많이 있습니다. 특히 webauthn.io에서는 실제 동작하는 예시를 보여주며 webauthn.guide에서 step by step으로 Javascript 소스를 통해 설명하고 있습니다. 만약 서버에서 Webauthn 인증을 구현하고 싶다면 W3C의 스펙 문서를 읽어보는게 좋습니다.