WebAuthn으로 강력한 인증 사용 설정

문제

피싱은 웹에서 가장 큰 보안 문제로 꼽힙니다. 해킹 관련 계정의 81% 가 피싱입니다. 취약하거나 도난당한 비밀번호를 이용한 사례도 있습니다. 업계의 집단 다중 인증(MFA)이었지만 구현이 단편화되어 있고 대부분의 경우 여전히 피싱에 적절히 대응하지 못하고 있습니다. YouTube는 이래로 FIDO Alliance와 2013년 그리고 최근에는 W3C를 통해 모든 웹 애플리케이션에서 사용할 수 있는 피싱 방지 프로토콜입니다.

WebAuthn이란 무엇인가요?

Web Authentication API는 웹 애플리케이션 사용자 에이전트 미디에이션에 의해 인증된 인증자에 대한 액세스를 USB/BLE/NFC를 통해 액세스되는 하드웨어 토큰이나 애플리케이션 범위의 생성 및 도전을 목적으로 함 (eTLD+k) 공개 키 사용자 인증 정보입니다. 이를 통해 다음과 같은 다양한 사용 사례가 가능합니다.

  • 마찰이 적고 피싱 방지 2단계 인증 (2단계 인증과 함께 사용) 비밀번호)
  • 패스워드리스의 생체 인식 기반 재승인
  • 비밀번호가 없어도 마찰이 적고 피싱 방지 2단계 인증 (사용 가능) (비밀번호가 없는 계정의 경우).

이 API는 대부분의 주요 브라우저에서 구현될 것이며, 온라인에서 신원을 증명해야 할 때 마주하게 되는 UI를 단순화하고 피싱을 현저히 줄일 수 있습니다.

WebAuthn은 Credential Management API를 확장하고 새로운 사용자 인증 정보 유형 PublicKeyCredential입니다. WebAuthn은 통신하며 사용자가 다음을 수행할 수 있도록 합니다.

  1. 웹사이트의 공개 키 사용자 인증 정보를 만들고 등록합니다.
  2. 해당 비공개 사이트가 소유하고 있음을 증명하여 웹사이트 인증 키를 누릅니다.

인증자는 비공개/공개 키 쌍을 생성하고 있습니다. 탭 한 번으로 서명에 동의할 수 있습니다. 지문 판독 또는 FIDO2를 준수하는 다른 방법으로 읽음 이 프로그램을 통해 학습한 모든 프로그램에 대한 인증 프로그램이 인증 기관입니다. OTP는 다음 중 하나에 내장될 수 있습니다. 플랫폼 (예: 스마트폰의 지문 스캐너)으로 부착하거나 USB, 저전력 블루투스 (BLE) 또는 근거리 무선통신 (NFC)을 지원합니다.

작동 방식

키 쌍 만들기 및 사용자 등록

사용자가 웹사이트에 사용자 인증 정보를 등록하려고 할 때 (WebAuthn으로 지칭됨) 를 '신뢰 당사자'로 지정):

  1. 신뢰 당사자가 챌린지를 생성합니다.
  2. 신뢰 당사자는 Credential Manager API를 통해 브라우저에 다음을 요청합니다. 신뢰 당사자의 새 사용자 인증 정보 생성, 기기를 지정 기능(예: 기기가 자체 사용자 인증을 제공하는지 여부) (생체 인식 등 사용)
  3. 인증자가 사용자 동의를 얻으면 인증자는 공개 키 및 선택적으로 서명된 증명을 있습니다.
  4. 웹 앱이 공개 키를 서버로 전달합니다.
  5. 서버는 공개 키를 사용자 ID와 함께 저장하여 사용자 인증 정보가 있어야 합니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

사용자 인증

웹사이트가 올바른 애플리케이션과 상호작용하고 있다는 증거를 확보해야 하는 경우 사용자:

  1. 신뢰 당사자가 챌린지를 생성하고 브라우저에 목록을 제공합니다. 사용자 인증 정보를 제공합니다. 또한 kubectl run을 사용하여 사용자 인증 정보를 찾습니다(예: 로컬 내장 인증자 또는 USB, BLE 등을 통한 외부 연결
  2. 브라우저에서 인증자에게 챌린지에 서명하도록 요청합니다.
  3. 인증자에 지정된 사용자 인증 정보 중 하나가 포함된 경우 인증자는 사용자 동의를 받은 후 웹 앱에 서명된 어설션을 반환합니다.
  4. 웹 앱은 서명된 어설션을 신뢰 당사자의 서버로 전달합니다. 확인합니다.
  5. 서버에서 확인하면 인증 흐름이 고려됩니다. 있습니다.
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

다음 링크에서 WebAuthn을 직접 사용해 보세요. https://webauthndemo.appspot.com/.

앞으로의 계획

Chrome 67 베타는 navigator.credentials.get({publicKey: ...})navigator.credentials.create({publicKey:... }) 지원 기능과 함께 제공되며 데스크톱에서 USB 전송을 통한 U2F/CTAP 1 인증자

향후 릴리스에서는 BLE 및 NFC와 같은 더 많은 전송과 새로운 CTAP 2선 프로토콜입니다. 또한 더 많은 고급 흐름도 CTAP 2 및 WebAuthn에 의해 활성화됨(예: PIN으로 보호된 인증자, 로컬 사용자 이름이나 비밀번호를 입력하는 대신 계정 선택 디지털 지문 등록

Microsoft Edge는 API를 지원함 Firefox 60부터 WebAuthn을 지원합니다.

리소스

Google에서는 더 자세한 문서를 준비하고 있습니다.

'웹에서 가입 및 로그인에 관한 새로운 소식' 세션 Google I/O 2018에서 WebAuthn을 다뤘습니다