FedCM 업데이트: API 연결 해제 및 두 개의 업데이트

Chrome 122부터 Federated Credential Management API(FedCM)Disconnect API를 사용할 수 있습니다. Disconnect API를 사용하면 신뢰 당사자가 서드 파티 쿠키를 사용하지 않고 ID 공급업체의 계정에서 사용자 연결을 해제할 수 있습니다. 또한 FedCM의 동일 사이트 처리에 몇 가지 업데이트가 있습니다.

API 연결 해제

사용자가 ID 제휴를 통해 신뢰 당사자(RP(인증을 위해 ID 공급업체를 사용하는 사이트)에서 계정을 만들면 ID 공급업체(IdP, 다른 당사자에게 인증 및 계정 정보를 제공하는 서비스)가 일반적으로 서버에 연결을 기록합니다. 저장된 연결을 통해 IdP는 사용자가 로그인한 RP를 추적하고 환경을 최적화할 수 있습니다. 예를 들어 사용자가 나중에 RP로 돌아올 때 더 나은 환경을 제공하기 위해 IdP가 있는 사용자 계정이 재방문 계정으로 취급되므로 자동 재인증 및 사용된 계정을 보여주는 맞춤설정된 버튼과 같은 기능을 사용할 수 있습니다.

IdP에서 RP에서 계정의 연결을 해제하는 API를 제공하는 경우도 있습니다. 하지만 연결 해제 흐름은 인증되며 IdP 쿠키가 필요합니다. 서드 파티 쿠키가 없는 환경에서 사용자가 RP를 방문하면 RP가 IdP에서 연결 해제할 수 있는 브라우저 API가 없습니다. 특정 RP에 연결된 동일한 IdP의 IdP 계정이 여러 개 있을 수 있으므로 연결 해제 흐름에서는 연결 해제되는 계정을 알아야 합니다.

Disconnect API를 사용하면 사용자가 지정된 엔드포인트에 신호를 보내 브라우저의 RP와 IdP 서버에서 IdP 계정을 연결 해제할 수 있습니다. 사용자는 Federated Credential Management API (FedCM)를 사용한 ID 제휴를 거쳐야 합니다. 사용자가 연결 해제되면 다음에 IdP를 사용하여 RP에 로그인하려고 할 때 신규 사용자로 취급됩니다.

RP에서 IdP 연결 해제

사용자가 이전에 FedCM을 통해 IdP를 사용하여 RP에 로그인한 경우 브라우저가 연결된 계정 목록으로 이 관계를 로컬로 기억합니다. RP는 IdentityCredential.disconnect() 함수를 호출하여 연결 해제를 시작할 수 있습니다. 이 함수는 최상위 RP 프레임에서 호출할 수 있습니다. RP는 configURL, IdP에서 사용하는 clientId, IdP의 연결을 해제하기 위한 accountHint를 전달해야 합니다. 연결 해제 엔드포인트가 계정을 식별할 수 있는 한 계정 힌트는 임의의 문자열일 수 있습니다(예: 계정 목록 엔드포인트에서 제공한 계정 ID와 일치하지 않는 이메일 주소 또는 사용자 ID).

// Disconnect an IdP account "account456" from the RP "https://idp.com/". This is invoked on the RP domain.
IdentityCredential.disconnect({
  configURL: "https://idp.com/config.json",
  clientId: "rp123",
  accountHint: "account456"
});

IdentityCredential.disconnect()에서 Promise를 반환합니다. 이 프로미스는 다음과 같은 이유로 예외를 발생시킬 수 있습니다.

  • 사용자가 FedCM을 통해 IdP를 사용하여 RP에 로그인하지 않았습니다.
  • API는 FedCM 권한 정책 없이 iframe 내에서 호출됩니다.
  • configURL이 잘못되었거나 연결 해제 엔드포인트가 누락되었습니다.
  • 콘텐츠 보안 정책(CSP) 확인에 실패합니다.
  • 대기 중인 연결 해제 요청이 있습니다.
  • 사용자가 브라우저 설정에서 FedCM을 사용 중지했습니다.

IdP의 연결 해제 엔드포인트가 응답을 반환하면 RP와 IdP가 브라우저에서 연결 해제되고 프로미스가 리졸브됩니다. 연결 해제 사용자 계정은 연결 해제 엔드포인트의 응답에 지정됩니다.

IdP 구성 파일 설정

Disconnect API를 지원하려면 IdP가 연결 해제 엔드포인트를 지원하고 IdP 구성 파일disconnect_endpoint 속성과 해당 경로를 제공해야 합니다.

{
  "accounts_endpoint": "/accounts",
  "id_assertion_endpoint": "/assertion",
  ...
  "disconnect_endpoint: "/disconnect"
}

연결 해제 엔드포인트에서 계정 연결 해제

브라우저는 IdentityCredential.disconnect()를 호출하여 쿠키와 콘텐츠 유형이 application/x-www-form-urlencoded인 교차 출처 POST 요청을 다음 정보와 함께 이 연결 해제 엔드포인트로 전송합니다.

속성 설명
account_hint IdP 계정에 대한 힌트입니다.
client_id RP의 클라이언트 식별자입니다.
POST /disconnect HTTP/1.1
Host: idp.example
Origin: rp.example
Content-Type: application/x-www-form-urlencoded
Cookie: 0x123
Sec-Fetch-Dest: webidentity

account_hint=account456&client_id=rp123

요청을 수신하면 IdP 서버는 다음을 실행해야 합니다.

  1. CORS(교차 출처 리소스 공유)를 사용하여 요청에 응답합니다.
  2. 요청에 Sec-Fetch-Dest: webidentity HTTP 헤더가 포함되어 있는지 확인합니다.
  3. Origin 헤더를 client_id에 의해 결정된 RP 출처와 일치시킵니다. 일치하지 않으면 거부합니다.
  4. account_hint와 일치하는 계정을 찾습니다.
  5. RP의 연결된 계정 목록에서 사용자 계정의 연결을 해제합니다.
  6. 식별된 사용자의 account_id를 JSON 형식으로 사용하여 브라우저에 응답합니다.

응답 JSON 페이로드의 예는 다음과 같습니다.

{
  "account_id": "account456"
}

IdP에서 브라우저가 RP와 연결된 모든 계정의 연결을 해제하도록 하려면 계정 ID와 일치하지 않는 문자열(예: "*")을 전달합니다.

RP와 IdP가 동일한 사이트인 경우 이제 /.well-known/web-identity 확인을 건너뜁니다.

FedCM 시스템을 개발할 때 테스트 또는 스테이징 RP 서버 도메인은 프로덕션 IdP 서버의 하위 도메인일 수 있습니다. 예를 들어 프로덕션 IdP 서버는 idp.example에 있고 스테이징 RP 서버와 스테이징 IdP 서버는 모두 staging.idp.example에 있습니다. 그러나 잘 알려진 파일은 IdP 서버의 eTLD+1 루트에 배치되어야 하므로 idp.example/.well-known/web-identity에 있어야 하며 프로덕션 서버입니다. 개발자가 개발 중인 프로덕션 환경에 파일을 배치할 필요는 없으므로 이렇게 하면 FedCM을 테스트할 수 없습니다.

Chrome 122부터 RP 도메인과 IdP 도메인이 동일한 경우 Chrome은 잘 알려진 파일 검사를 건너뜁니다. 이렇게 하면 개발자가 이러한 시나리오에서 테스트할 수 있습니다.

이제 하위 리소스가 동일 사이트 로그인 상태를 설정할 수 있음

이전에는 Chrome에서 요청이 모든 조상과 동일한 출처인 경우에만 로그인 상태(예: Set-Login: logged-in 헤더 사용)를 설정할 수 있었습니다. 이로 인해 로그인 상태를 설정하는 동일 사이트 fetch() 요청을 통한 로그인이 방지되었습니다.

예를 들어 사용자가 idp.example에 사용자 이름과 비밀번호를 입력할 수 있지만 사용자 인증 정보는 fetch()와 함께 login.idp.example에 게시되는 웹사이트를 생각해 보세요. 두 도메인이 교차 출처 및 동일 사이트이므로 로그인 상태 API를 사용하여 브라우저에 로그인 상태를 기록할 수 없습니다.

이 변경으로 Google은 Login Status API가 모든 상위 요소와 동일한 사이트여야 한다는 요구사항을 완화했으며, 위의 예에서 HTTP 헤더 (Set-Login: logged-in)를 사용하여 login.idp.example의 로그인 상태를 설정할 수 있습니다.

요약

이제 FedCM은 Disconnect API를 사용하여 서드 파티 쿠키에 의존하지 않고도 RP를 IdP에서 연결 해제할 수 있습니다. 이렇게 하려면 RP에서 IdentityCredential.disconnect()를 호출합니다. 이 기능을 통해 브라우저는 IdP의 연결 해제 엔드포인트로 요청을 보내서 IdP가 서버 및 브라우저에서 연결을 종료할 수 있습니다.

RP와 IdP가 동일한 사이트인 경우 테스트 목적으로 /.well-known/web-identity 검사를 건너뛰는 것으로 발표했습니다. 또한 이제 동일 사이트 IdP 하위 리소스의 HTTP 응답 헤더를 통해 로그인 상태를 설정할 수 있습니다.