비밀번호 기반 인증이 왜 취약한지, 패스키가 어떻게 피싱 저항성과 더 강한 보안을 제공하는지, 그리고 WebAuthn 기반 인증이 비밀번호를 어떻게 대체할 수 있는지 살펴봅니다.
비밀번호가 해킹된 자격 증명에서 대부분, 아니 어쩌면 대다수의 데이터 유출이 시작된다는 사실을 알고 있었나요?
네, 맞습니다. 여러분의 모든 개인 정보(가족의 정보까지)가 해마다 20번씩 도난당하고 유출되었다면, 그 이유는 기업과 정부 기관의 직원들이 자기 비밀번호를 비밀로 유지하지 못하기 때문입니다.
사실 여러분의 비밀번호(그리고 제 비밀번호도)는 이미 유출되었을 수 있고, 여러분은 그 사실조차 모를 수 있습니다.
하지만 너무 자책하지는 마세요. 그들(혹은 여러분, 혹은 저)의 잘못이 아닙니다. 비밀번호를 안전하게 지키기에는 애초에 확률이 우리에게 불리합니다. 비밀번호 기반 인증은 그냥 형편없습니다.
저는 자격 증명이 탈취되는 가장 흔한 방법들을 최대한 소개하려고 했지만, 비밀번호를 손상시키는 방법은 너무나 많아서 제가 무언가를 빠뜨리지 않았다고 장담할 수는 없습니다.

비밀번호의 가장 큰 문제는 아마도 피싱에 취약하다는 점일 것입니다. 아무것도 모르는 사용자가 mybank.com 자격 증명을 www-mybank.com에 입력하는 것을 막아주는 장치는 없습니다. 여기서 www-mybank.com은 범죄자들이 설치한 함정 사이트입니다. 여러분은 자신이 피싱 이메일에 속을 만큼 어리석지 않다고 생각할 수도 있습니다. 하지만 여러분의 할머니는 어떨까요? 또는 통신 회사의 직원은 어떨까요? 비밀번호가 완전히 사라지기 전까지 피싱은 계속 통할 것입니다. 우리 모두는 집중하지 못하는 안 좋은 날이 있기 때문이기도 하고, 공격자들이 우리가 적응하는 속도보다 더 빠르게 새로운 기술과 전략을 개발하기 때문이기도 합니다.
그다음은 악성코드입니다. 키보드에 입력하는 내용을 기록해서 비밀번호를 훔치는 키로거는 이미 익숙할 수 있습니다. 하지만 10년도 더 전에 악성코드가 프로세스와 라이브러리에 주입되어 암호화 및 네트워크 관련 함수를 후킹하고, 트래픽이 암호화되어 네트워크로 보내지기 전에 이를 가로채는 일이 드물지 않았다는 사실을 알고 있었나요?
악성코드는 여러분의 웹 브라우저와 다른 민감한 애플리케이션에 직접 코드를 주입함으로써, "email"이나 "password" 같은 키워드를 기준으로 외부로 나가는 트래픽을 필터링하고 기록할 수 있습니다.
그다음은 중간자 공격(Man in the Middle) 가로채기입니다. 오늘날 대부분의, 아니 사실상 모든 인터넷 트래픽은 TLS로 암호화되지만, 우리의 인터넷 보안 전체는 우리가 인정하고 싶은 것보다 훨씬 더 취약하며, 상당히 불투명한 조직인 인증 기관(Certificate Authorities)에 의존하고 있습니다. 이들은 악성 인증서를 발급할 수 있는 힘을 가지고 있으며(정부 기관의 요청 때문이든, 해킹의 결과이든), 그렇게 발급된 인증서는 여러분의 기기와 여러분이 사용하는 서비스의 서버 사이를 오가는 트래픽을 전송 구간에서 가로채는 데 사용될 수 있습니다.
과거에는 클라이언트 쪽 악성코드보다 덜 흔했지만, 이제는 서버를 직접 감염시키는 추세가 점점 더 커지고 있습니다. 서버에 설치된 악성코드는 프로세스와 라이브러리를 후킹해서 데이터가 복호화된 뒤 민감한 정보에 접근할 수 있습니다.
마지막으로 데이터베이스 유출이 있습니다. 공개 인터넷에 활짝 열려 있는 데이터베이스(또는 S3 버킷) 때문이든, 고전적인 SQL 인젝션 때문이든, 어떤 회사가 자사 사용자 데이터 전체가 이제 딥웹에서 팔리고 있다고 인정해야 하는 주가 한 주도 빠짐없이 이어집니다.
이 모든 것은 범죄자들과 (분명히) 기관들이 탈취한 자격 증명을 사고파는 "건전한" 암시장을 만들어냅니다. 세계의 대부분 대기업과 정부 기관에 대한 탈취 자격 증명을 구매해서 네트워크에 침투하고 데이터를 빼내는 일은 생각보다 어렵지 않습니다.
이쯤이면 여러분도 비밀번호가 형편없고, 점점 더 디지털화되는 우리의 삶을 보호하기에는 명백히 매우 나쁜 방식이라는 데 동의하길 바랍니다.
대신, "암호학적으로 충분히 안전"하면서도 네트워크로 전송할 필요가 없는 인증 메커니즘이 있다면 어떨까요?
바로 서명입니다!

서명은 개인 키를 가진 사람이 메시지를 인증할 수 있게 해줍니다. 메시지에 서명함으로써, 개인 키 소유자는 그 유효성을 증명합니다. 그리고 공개 키에 접근할 수 있는 누구나 서명이 그 메시지와 일치하는지 검증할 수 있습니다.
서명에 관해서는 제 글 Signatures: The foundations of modern end-to-end encryption과 제 책 Black Hat Rust에서 더 자세히 알아볼 수 있습니다.
패스키는 바로 이것입니다. 개인 키는 여러분의 기기에 저장되고, 공개 키는 서버에 저장됩니다.
_패스키_는 Web Authentication (WebAuthn) 자격 증명을 가리키는 마케팅 용어입니다.
패스키는 소프트웨어 기반일 수도 있고 기기 간 동기화될 수도 있으며(예: passwordkey manager), 하드웨어 기반이며 특정 기기에 묶여 있을 수도 있습니다(예: 하드웨어 보안 키).
개념적으로는 아주 단순합니다. 서비스에 가입할 때 개인 키와 공개 키 한 쌍을 생성합니다.
개인 키는 여러분의 패스키 관리자(예: Apple Keychain)에 저장되고, 공개 키는 해당 서비스의 데이터베이스에 저장됩니다.

그다음 로그인 과정에서는 서버가 무작위로 생성한 챌린지를 보내고, 여러분의 기기는 개인 키로 이에 서명하며, 서버는 그 챌린지의 서명이 공개 키와 일치하는지 검증합니다.

개인 키는 네트워크를 통해 전송되지 않고 도메인(예: my-bank.com)에 묶여 있기 때문에, 패스키는 피싱에 강합니다.
WebAuthn과 패스키 데모는 webauthn.io에서 확인할 수 있습니다.
자격 증명을 생성하고 챌린지에 서명하는 코드 조각은 web.dev의 패스키 등록 튜토리얼에서 볼 수 있습니다.
가장 좋은 점이 뭐냐고요? 여러분이 휴가 중이고 휴대폰과 지갑만 남기고 모든 것을 잃어버렸으며, 심지어 휴가 중 집에 불까지 났다고 해봅시다. WebAuthn의 제가 가장 좋아하는 활용 사례 중 하나는, 단순히 QR 코드를 스캔하거나 하드웨어 보안 키를 꽂는 것만으로 안전하지 않은 어떤 컴퓨터(예: 이웃집 컴퓨터나 공공 도서관 컴퓨터)에서도 여러분의 온라인 계정에 접속할 수 있고, 자격 증명이 유출될 위험이 없다는 점입니다(로그아웃은 잊지 마세요).

멋지지 않나요?
WebAuthn 표준은 bloated 방대해서 여기서 자세히 다루지 않을 정도로 많은 사용 사례를 포함하고 있지만, 더 알고 싶다면 Adam Langley의 A Tour of WebAuthn과 Mozilla의 Web Authentication API 페이지를 살펴보세요.
패스키는 사람들에게 passwordkey manager를 쓰게 만듭니다. 네.
하지만 사실 그건 아주 좋은 일입니다! 여러분은 이미 웹사이트마다 고유한 비밀번호를 두는 비밀번호 관리자를 써야 합니다. 그렇다면 여기에 피싱 저항성과 크래킹 저항성까지 더하지 않을 이유가 있을까요?
여러분은 결코 Big Tech가 제공하는 패스키 관리자만 사용하도록 강제되지 않습니다. 실제로는 더 안전하고 더 탄력적인 제3자 제품을 사용할 수 있습니다. 이런 제품들은 터무니없는 이유로 여러분의 계정을 일방적으로 종료해도 이의 제기조차 못 하게 만들 가능성이 더 적기 때문입니다.
그렇다면 왜 Big Tech는 패스키를 이렇게 강하게 밀어붙일까요? 이유는 간단합니다. 그들은 매일 얼마나 많은 공격을 받고 있는지 여러분이 상상도 못 할 정도이며, 패스키는 그런 공격의 대부분을 무력화할 수 있기 때문입니다. 또한 그들은 법적·보안적 책임을 줄이는 데도 분명한 이해관계가 있습니다.
그렇기도 하고 아니기도 합니다!
2단계 인증(2FA)은 대체로 비밀번호가 너무 쉽게 탈취되기 때문에 그 위에 덧댄 "응급 패치"였습니다.
그렇다고 해도 패스키가 무적은 아닙니다. 여전히 탈취될 수 있고(비밀번호보다 훨씬 어렵긴 하지만), 예를 들어 패스키 관리자 해킹(악성코드 또는 마스터 비밀번호 피싱)으로 인해 유출될 수 있으므로, 보안에 민감한 조직은 여전히 2FA를 구현하고 싶어 할 것입니다.
제 생각에는 소프트웨어 기반 패스키 관리자 + 2FA용 하드웨어 보안 장치의 조합이, 둘 다 피싱에 강하다는 점에서 디지털 공격과 물리적 공격 모두에 대한 최선의 보호를 제공합니다.
그렇기도 하고 아니기도 합니다!
아시다시피, 양자 컴퓨터는 Shor's algorithm 때문에 현재의 비대칭 암호에 위협이 됩니다. 우리는 비대칭 암호를 깨뜨릴 수 있는 양자 컴퓨터를 Cryptographically Relevant Quantum Computers (CRQCs)라고 부릅니다. 다행히도 우리는 아직 최소한 하나의 CQRC조차 개발하지 못한 상태에서 한참 멀리 떨어져 있습니다. 양자 계산은 특히 안정성과 오류 정정 문제 때문에 구현하기가 어렵기 때문입니다.
하지만 그것은 결국 시간문제일 뿐입니다.
Daniel J. Bernstein의 표현을 빌리면, 서로 다른 세 가지 사건의 시점에 대한 예측을 구분하는 것이 중요합니다.
많은 전문가와 기관은 CRQC가 2030/2040년경에는 등장할 수 있다고 예측합니다.
그러므로 오늘 생성되는 패스키는 미래의 양자 컴퓨터에 취약합니다. 하지만 2024년 8월에 NIST는 포스트 양자 디지털 서명을 위한 FIPS 204 표준인 ML-DSA를 발표했습니다.
따라서 FIDO Alliance와 W3C가 WebAuthn용 양자 저항성 서명 체계를 발표하는 것도 시간문제이며, 패스키 관리자와 서비스 제공자들이 양자 취약 패스키에 대해 크게 경고하고 여러분이 이를 교체할 수 있도록 하리라고 저는 예상합니다. 그래도 이 상황은 비밀번호를 6개월마다 바꾸는 것보다는 낫습니다.
하드웨어 보안 키의 전환은 조금 더 비싸고 더 느릴 것입니다.
비밀번호와 같습니다. 서비스는 계정을 복구할 수 있는 방법을 제공해야 합니다.
패스키 관리자는 여러분의 디지털 삶의 안전한 핵심이어야 합니다. 여러분의 기기가 집에서 멀리 떨어진 곳에서 도난당하거나 파손되는 경우를 대비해 복구 계획을 세우는 책임은 여러분에게 있습니다.
사실 이 점은 지금도 마찬가지여야 합니다. 여러분은 기억할 수 없을 정도로 긴 비밀번호를 저장하는 비밀번호 관리자를 사용하고 있어야 하기 때문입니다.
증명은 서버가 어떤 패스키가 특정 브랜드 및/또는 모델에 속하는지 검증할 수 있게 해주는 방식입니다.
거의 모든 하드웨어 보안 키는 하드코딩된 증명용 개인 키를 탑재하고 있으며, 이를 사용해 다른 생성된 공개 키에 서명함으로써 그것들이 "안전한 하드웨어 조각"에서 왔음을 보장할 수 있습니다(예: 특정 브랜드 제품임을 보장).
이 글에서 이것을 다루지 않은 이유는 꽤 고급 주제이기 때문이며, 기업 환경 외에는 널리 배포되지 않을 것이라고 생각하기 때문입니다.
이에 관해 더 알아보고 구현 방법까지 보려면 여기를 참고하세요.
강한 비밀번호는 종단간 암호화에 사용되는 안전한 키를 만들기 위해 파생될 수 있습니다. 예를 들어 모든 비밀번호 관리자는 내부적으로 이런 식으로 동작합니다.
그리고 좋은 소식이 있습니다! WebAuthn은 PRF extension을 통해 이를 지원하며, 신뢰 당사자(relying parties)는 이를 사용해 격리된 대칭 암호화 키를 얻을 수 있습니다. 이를 바탕으로 애플리케이션은 키 계층 구조를 만들거나, 견고한 암호 시스템을 구축하기 위해 원하는 무엇이든 만들 수 있습니다.
저는 -8 (Ed25519)과 -7 (ES256 / ECDSA)을 이 순서대로 권장합니다. 둘 다 FIPS를 준수합니다.
구형 Windows Hello 같은 레거시 구현은 RSA인 -257 (RS256)만 지원합니다. RSA는 사용하지 마세요. 레거시 기기 때문에 패스키 구현을 약화시키느니, magic links / one time codes 같은 대체 인증 방식을 제공하는 편이 낫습니다.
그렇습니다!
사용자는 더 나은 경험과 더 안전한 온라인 계정을 얻습니다.
제공자는 피싱에 대한 더 강한 보호를 얻고, 사용자 데이터베이스가 유출되는 상황에서도 사용자 보안을 더 잘 지킬 수 있습니다.
이것이 바로 백만 달러짜리 질문입니다!
여기서 저는 과감해야 한다고 권합니다. 왜냐하면 현재 많은 서비스가 그렇듯 비밀번호와 패스키를 공존시키는 것은 사용자가 여전히 취약한 상태로 남기 때문에, 패스키의 목적을 완전히 무너뜨리기 때문입니다.
사용자가 패스키 없이 로그인하면, 데이터베이스에서 비밀번호를 삭제하고 이메일로 magic link / one-time code를 보내세요. 그리고 나서 사용자에게 패스키 등록을 유도하는 화면을 보여주세요.
이 블로그를 오래 읽어온 분들은 어떤 것이 "$INDUSTRY의 미래"라고 선언될 때 제가 종종 회의적이라는 것을 아실 수 있습니다. 하지만 패스키에 대해서는 상황이 다릅니다. 저는 1000% 찬성입니다.
비밀번호 관리자에는 찬성하면서 패스키에는 반대할 수는 없습니다. 패스키는 강력한 암호학과 피싱 저항성이 기본으로 내장된 비밀번호 관리자의 자연스러운 진화일 뿐입니다.
비밀번호 기반 인증은 형편없고 대부분의 해킹과 데이터 유출의 근본 원인입니다. 아무 조치도 하지 않는다면 이 추세는 더 가속화될 수밖에 없습니다. 여러분과 저는, 기억도 못 할 정도로 오래전에 계정을 만든 어느 회사의 과로한 직원이 GPT-25가 만든 피싱 전화를 믿어버렸다는 이유로, 매달 다른 해킹 그룹에게 우리의 데이터가 도난당하는 세상을 원하지 않습니다.
패스키는 보안뿐 아니라 사용자 경험(그리고 결국 수익) 측면에서도 엄청난 승리입니다. 이것은 보안의 미래가 아니라, 바로 현재입니다.
무엇을 기다리고 있나요?