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 계정이 있을 수 있으므로 연결 해제 흐름에서는 어떤 계정이 연결 해제되었는지 알아야 합니다.

연결 해제 API를 사용하면 사용자가 지정된 엔드포인트에 신호를 보내어 IdP 서버는 물론 브라우저의 RP에서도 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 구성 파일 설정

연결 해제 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. JSON 형식으로 식별된 사용자의 account_id로 브라우저에 응답합니다.

응답 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에 사용자 이름과 비밀번호를 입력할 수 있지만 사용자 인증 정보는 login.idp.examplefetch()와 함께 게시되는 웹사이트를 가정해 보겠습니다. 두 도메인이 교차 출처이고 동일한 사이트이므로 Login Status API를 사용하여 브라우저에 로그인 상태를 기록할 수 없습니다.

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

요약

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

테스트를 위해 RP와 IdP가 동일한 사이트인 경우 /.well-known/web-identity 검사를 건너뛰게 된다고 안내해 드렸습니다. 또한 이제 동일한 사이트 IdP 하위 리소스의 HTTP 응답 헤더를 통해 로그인 상태를 설정할 수 있습니다.