[webauthn] Remove the expired iCloud Keychain rollout flags

IN REVIEW2026device/fidochrome/browser/webauthnflag-cleanup
2026. 9. 16.jmsmg 프로필 이미지jmsmg

macOS에서 플랫폼 인증기 생성 요청을 iCloud Keychain으로 기본 보낼지 정하던 롤아웃 플래그 다섯 개 가운데, M118에 기본 켜졌고 «M121 이후 제거»라고 적혀 있던 세 개를 제거했습니다. 트리는 M155라 34개 마일스톤이 지난 상태였습니다. 3파일 +8/−40, 동작은 바뀌지 않습니다.

문제 설명

  • issue url: 없음 (자체 발굴)
  • device/fido/public/features.cckWebAuthnICloudKeychainForGoogle, …ForActiveWithDrive, …ForInactiveWithDrive는 모두 FEATURE_ENABLED_BY_DEFAULT이고 «Enabled in M118. Remove in or after M121» 주석이 붙어 있었습니다.
  • 유일한 사용처는 chrome/browser/webauthn/chrome_authenticator_request_delegate.ccShouldCreateInICloudKeychain()입니다. google.com 요청인지, 프로필 인증기 활성 사용자인지, iCloud Drive가 켜져 있는지 조합마다 플래그 하나를 골라 IsEnabled를 묻는 5분기 트리였는데, 세 분기의 답은 항상 true였습니다.

해결 내용

  • 선언(features.h)과 정의(features.cc)에서 세 플래그를 지웠습니다. 아직 기본 꺼짐인 …ForActiveWithoutDrive, …ForInactiveWithoutDrive는 그대로 둡니다.
  • 결정 트리를 «google.com 요청이거나 iCloud Drive가 켜져 있으면 true, 아니면 활성/비활성에 따라 남은 두 플래그»로 줄였습니다.
-  const base::Feature* feature;
-  if (request_is_for_google_com) {
-    feature = &device::kWebAuthnICloudKeychainForGoogle;
-  } else {
-    ... (활성/비활성 × Drive 유무 4분기)
-  }
-  return base::FeatureList::IsEnabled(*feature);
+  if (request_is_for_google_com || has_icloud_drive_enabled) {
+    return true;
+  }
+  return base::FeatureList::IsEnabled(
+      is_active_profile_authenticator_user
+          ? device::kWebAuthnICloudKeychainForActiveWithoutDrive
+          : device::kWebAuthnICloudKeychainForInactiveWithoutDrive);

about_flags·flag-metadata·enums.xml·fieldtrial_testing_config에 등록되지 않은 플래그라 다른 파일은 손댈 것이 없었고, 테스트도 플래그를 직접 켜고 끄지 않습니다(«change detector»가 될 뿐이라는 주석). gn check 통과.

발굴 과정

09-15 «Remove … after/in M» 만료 주석 스윕(97건)에서 나온 항목입니다. 같은 파일에 «Not yet enabled by default»인 형제 플래그 두 개가 있어, 만료된 셋만 걷어내고 둘은 남기는 경계를 정하는 것이 핵심이었습니다. 플래그 이름이 든 열린 CL이 없는 것을 확인하고 OSSCA #441로 등록한 뒤 착수했습니다.

테스트 방법

동작 불변 정리라 새 테스트는 없고 기존 테스트 통과가 검증입니다.

  • unit_tests 빌드: Mac M5, -j 6, 3시간 34분 / 37,212 스텝 (직전에 base 헤더를 건드린 다른 CL 브랜치를 오간 탓에 check.h를 포함하는 파일이 전부 다시 빌드됨)
  • unit_tests --gtest_filter='ChromeAuthenticatorRequestDelegate*' 6/6 통과 (ShouldCreateInICloudKeychain 테스트 포함)

배운 점

  • 롤아웃 플래그 묶음을 정리할 땐 «전부 지운다»가 아니라 «기본값이 켜진 것만 지운다»가 경계입니다. 형제 플래그의 기본값과 주석을 하나씩 확인해야 합니다.
  • git cl upload-s(--send-mail) 없이 올리면 새 CL이 WIP로 올라가 리뷰어에게 알림이 가지 않습니다. 이번엔 PS2를 -s로 올려 풀었습니다.
  • 두 번째 업로드부터 git cl은 Gerrit에 있는 설명을 쓰므로 커밋 메시지를 고쳐도 반영되지 않습니다. git cl description -n +로 따로 밀어야 합니다.

참고 자료