<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title type="text"></title>
<subtitle></subtitle>

<link rel="self" type="application/atom+xml" href="."/>
<link rel="alternate" type="text/html" href="/en/" />
<updated>2026-01-25T00:00:00Z</updated>
<id></id>
<author>
  <name></name>
  <uri>/</uri>
  <email></email>
</author>


<entry>
  <title type="html"><![CDATA[Introducing WebAuthn DevTools]]></title>
  <link rel="alternate" type="text/html" href="/en/2026/01/webauthn-devtools.html" />
  <id></id>
  <published>2026-01-25T00:00:00Z</published>
  <updated>2026-01-25T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2026/01/webauthn-devtools.html</id>
  <content type="html">&lt;p&gt;When implementing passkeys yourself or investigating how passkeys work on other websites, setting up a debugger to capture requests and responses or parsing binaries to read the contents is not easy. You can easily achieve this using a Chrome Extension called WebAuthn DevTools.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;h2 id=&quot;what-is-webauthn-devtools%3F&quot; tabindex=&quot;-1&quot;&gt;What is WebAuthn DevTools? &lt;a class=&quot;header-anchor&quot; href=&quot;#what-is-webauthn-devtools%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/webauthn-devtools/ogpaejcbmlcjnkcbnfmdfheifgodnnec&quot;&gt;WebAuthn DevTools&lt;/a&gt; is a Chrome Extension that streamlines WebAuthn debugging.&lt;/p&gt;
&lt;figure style=&quot;max-width: 600px; margin: 0 auto 30px;&quot;&gt;
      &lt;img src=&quot;/images/2026/webauthn-devtools-chromewebstore.jpg&quot; alt=&quot;WebAuthn DevTools at the Chrome Web Store&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;WebAuthn DevTools at the Chrome Web Store&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;You can use it immediately by launching Chrome DevTools on a page where WebAuthn is used and selecting the &amp;quot;WebAuthn&amp;quot; tab.&lt;/p&gt;
&lt;p&gt;The left panel displays executed WebAuthn commands, and the right panel shows detailed requests and responses.&lt;/p&gt;
&lt;figure style=&quot;max-width: 600px; margin: 0 auto 30px;&quot;&gt;
      &lt;img src=&quot;/images/2026/webauthn-devtools.jpg&quot; alt=&quot;WebAuthn DevTools Screen&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;WebAuthn DevTools Screen&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;In particular, responses from &lt;code&gt;navigator.credentials.get()&lt;/code&gt; and &lt;code&gt;navigator.credentials.create()&lt;/code&gt; contain binaries, making it tedious to decode and read the contents, but WebAuthn DevTools displays parsed information on the spot. &lt;a href=&quot;https://web.dev/articles/webauthn-aaguid&quot;&gt;If the AAGUID is included, it also displays the name of the corresponding password manager&lt;/a&gt;.&lt;/p&gt;
&lt;figure style=&quot;max-width: 600px; margin: 0 auto 30px;&quot;&gt;
      &lt;img src=&quot;/images/2026/webauthn-devtools-response-details.jpg&quot; alt=&quot;WebAuthn DevTools Response Details&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;WebAuthn DevTools Response Details&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;Also, some parameters display brief descriptions and links to learn more details.&lt;/p&gt;
&lt;figure style=&quot;max-width: 400px; margin: 0 auto 30px;&quot;&gt;
      &lt;img src=&quot;/images/2026/webauthn-devtools-infolink.jpg&quot; alt=&quot;Explanations displayed in WebAuthn DevTools&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;Explanations displayed in WebAuthn DevTools&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary &lt;a class=&quot;header-anchor&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/agektmr/webauthn-devtools&quot;&gt;The source code is available at GitHub&lt;/a&gt;. I&#39;m also considering Safari and Firefox versions in the future. It is a handy tool for those interested in passkeys and WebAuthn for quick investigation and debugging. Please give it a try.&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[Key terminologies to get a grasp of passkeys]]></title>
  <link rel="alternate" type="text/html" href="/en/2025/12/passkey-keywords.html" />
  <id></id>
  <published>2025-12-14T00:00:00Z</published>
  <updated>2025-12-14T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2025/12/passkey-keywords.html</id>
  <content type="html">&lt;p&gt;At the &lt;a href=&quot;https://fidoalliance.org/event/fido-tokyo-seminar/&quot;&gt;FIDO Tokyo Seminar&lt;/a&gt;, I was told it&#39;s hard to track the high-level picture of how passkeys are evolving, and I thought it would be helpful to introduce key terminologies so you can get a grasp of the passkey world and look into more details when necessary. So here it is.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;h2 id=&quot;standards&quot; tabindex=&quot;-1&quot;&gt;Standards &lt;a class=&quot;header-anchor&quot; href=&quot;#standards&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 :=&quot;&quot; id=&quot;fido&quot; tabindex=&quot;-1&quot;&gt;FIDO &lt;a class=&quot;header-anchor&quot; href=&quot;#fido&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;FIDO (Fast IDentity Online) is a set of open standards for authentication. The &lt;a href=&quot;https://fidoalliance.org/&quot;&gt;FIDO Alliance&lt;/a&gt; develops these standards to reduce the world&#39;s reliance on passwords.&lt;/p&gt;
&lt;h3 :=&quot;&quot; id=&quot;u2f&quot; tabindex=&quot;-1&quot;&gt;U2F &lt;a class=&quot;header-anchor&quot; href=&quot;#u2f&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;U2F (Universal 2nd Factor) is an older FIDO standard for two-factor authentication. It uses a hardware security key as a second factor. FIDO2 is backward compatible with U2F.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-overview-v1.2-ps-20170411.html&quot;&gt;Universal 2nd Factor (U2F) Overview | FIDO Alliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;uaf&quot; tabindex=&quot;-1&quot;&gt;UAF &lt;a class=&quot;header-anchor&quot; href=&quot;#uaf&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;UAF (Universal Authentication Framework) is an older FIDO standard for passwordless authentication. It was designed for mobile devices and biometric authentication.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/specs/fido-uaf-v1.2-ps-20171128/fido-uaf-overview-v1.2-ps-20171128.html&quot;&gt;Universal Authentication Framework (UAF) Overview | FIDO Alliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;fido2&quot; tabindex=&quot;-1&quot;&gt;FIDO2 &lt;a class=&quot;header-anchor&quot; href=&quot;#fido2&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;FIDO2 is the latest set of specifications from the FIDO Alliance. It enables users to leverage common devices to easily authenticate to online services in both mobile and desktop environments. FIDO2 consists of the W3C&#39;s &lt;a href=&quot;#webauthn&quot;&gt;Web Authentication (WebAuthn)&lt;/a&gt; specification and the FIDO Alliance&#39;s Client-to-Authenticator Protocol (CTAP).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/fido2/&quot;&gt;FIDO2: Web Authentication (WebAuthn) | FIDO Alliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;webauthn&quot; tabindex=&quot;-1&quot;&gt;WebAuthn &lt;a class=&quot;header-anchor&quot; href=&quot;#webauthn&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;WebAuthn (Web Authentication) is a browser API standard developed by the W3C. It allows web applications to create and use strong, attested, scoped, public-key-based credentials for the purpose of strongly authenticating users.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/webauthn/&quot;&gt;Web Authentication: An API for accessing Public Key Credentials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;basics&quot; tabindex=&quot;-1&quot;&gt;Basics &lt;a class=&quot;header-anchor&quot; href=&quot;#basics&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 :=&quot;&quot; id=&quot;authenticator&quot; tabindex=&quot;-1&quot;&gt;Authenticator &lt;a class=&quot;header-anchor&quot; href=&quot;#authenticator&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An authenticator is a device that stores and manages passkeys. It can be a hardware security key, a password manager (passkey provider), or a mobile device. In this article, a &amp;quot;password manager&amp;quot; represents authenticators (because it&#39;s the most frequently used authenticator).&lt;/p&gt;
&lt;h3 :=&quot;&quot; id=&quot;rp&quot; tabindex=&quot;-1&quot;&gt;Relying Party (RP) &lt;a class=&quot;header-anchor&quot; href=&quot;#rp&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A relying party is a website or application that requests passkeys from the user. It is responsible for verifying the user&#39;s identity and storing the public keys.&lt;/p&gt;
&lt;h3 :=&quot;&quot; id=&quot;rp-id&quot; tabindex=&quot;-1&quot;&gt;RP ID &lt;a class=&quot;header-anchor&quot; href=&quot;#rp-id&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;RP ID (Relying Party Identifier) is the domain name of the website requesting the passkey. It defines the scope of the credential, ensuring that a passkey created for &lt;code&gt;example.com&lt;/code&gt; cannot be used on &lt;code&gt;evil.com&lt;/code&gt;. It must be a valid domain string and a suffix of the current origin.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialCreationOptions#id_2&quot;&gt;PublicKeyCredentialCreationOptions - Web APIs | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;discoverable-credentials&quot; tabindex=&quot;-1&quot;&gt;Discoverable Credentials &lt;a class=&quot;header-anchor&quot; href=&quot;#discoverable-credentials&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Discoverable credentials (formerly known as &amp;quot;Resident Keys&amp;quot;) are passkeys that are stored on the password manager along with the user&#39;s account information (like username and display name). They enable &amp;quot;username-less&amp;quot; authentication flows, where the user just clicks &amp;quot;Sign in&amp;quot; and selects their account from a list provided by the password manager.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-discoverable-credentials&quot;&gt;Discoverable credentials deep dive | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;user-verification&quot; tabindex=&quot;-1&quot;&gt;User Verification &lt;a class=&quot;header-anchor&quot; href=&quot;#user-verification&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;User verification refers to the process of verifying that the person authenticating is the actual owner of the password manager, typically via a biometric check (fingerprint, face ID) or a PIN. A user verification happens locally, so information such as biometric data or PIN is not sent to the server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-user-verification&quot;&gt;userVerification deep dive | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;attestation&quot; tabindex=&quot;-1&quot;&gt;Attestation &lt;a class=&quot;header-anchor&quot; href=&quot;#attestation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Attestation is a cryptographic proof provided by the authenticator during credential creation. It allows the RP to verify the make and model of the authenticator (e.g., &amp;quot;This is a YubiKey 5 NFC&amp;quot;). This is primarily used in enterprise or high-security contexts to enforce policies (e.g., &amp;quot;only allow hardware keys&amp;quot;). In general, passkeys on password managers don&#39;t support attestations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/fido-technotes-the-truth-about-attestation/&quot;&gt;FIDO TechNotes: The Truth about Attestation | FIDO Alliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;aaguid&quot; tabindex=&quot;-1&quot;&gt;AAGUID &lt;a class=&quot;header-anchor&quot; href=&quot;#aaguid&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The AAGUID (Authenticator Attestation Globally Unique Identifier) is a 128-bit identifier indicating the type (model) of the authenticator. It allows RPs to identify the specific device being used (e.g., Google Password Manager, iCloud Keychain, Windows Hello, or a specific security key model) even without full attestation. It can be used to detect which password manager the passkey is created on to display the provider&#39;s icon, name, and other information by referencing &lt;a href=&quot;#mds&quot;&gt;MDS&lt;/a&gt;, but verification is not possible, since passkeys on password managers don&#39;t support attestations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-aaguid&quot;&gt;Determine the passkey provider with AAGUID | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/passkeydeveloper/passkey-authenticator-aaguids&quot;&gt;Passkey Provider AAGUIDs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;mds&quot; tabindex=&quot;-1&quot;&gt;MDS &lt;a class=&quot;header-anchor&quot; href=&quot;#mds&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The MDS (FIDO Metadata Service) is a centralized repository of information about FIDO authenticators. RPs can query the MDS using an AAGUID to retrieve details like the authenticator&#39;s certification status, icon, and supported features.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/metadata/&quot;&gt;FIDO Metadata Service (MDS) Overview | FIDO Alliance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;implementation&quot; tabindex=&quot;-1&quot;&gt;Implementation &lt;a class=&quot;header-anchor&quot; href=&quot;#implementation&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 :=&quot;&quot; id=&quot;exclude-credentials&quot; tabindex=&quot;-1&quot;&gt;excludeCredentials &lt;a class=&quot;header-anchor&quot; href=&quot;#exclude-credentials&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;excludeCredentials&lt;/code&gt; is a parameter that indicates a list of credential IDs that the server sends to the browser during the passkey creation process. It tells the password manager &amp;quot;if you already hold one of these credentials, don&#39;t create a new one.&amp;quot; This prevents creating multiple passkeys for the same account on the same password manager.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-exclude-credentials&quot;&gt;Prevent creating a new passkey if one exists | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;conditional-mediation&quot; tabindex=&quot;-1&quot;&gt;Conditional mediation &lt;a class=&quot;header-anchor&quot; href=&quot;#conditional-mediation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also known as &amp;quot;Conditional UI&amp;quot; or &amp;quot;Conditional Get&amp;quot;, this feature allows passkeys to be offered in the browser&#39;s autofill suggestions on standard username input fields. It enables a seamless transition from passwords to passkeys by letting users sign in with a passkey directly from the form they are used to.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/passkey-form-autofill&quot;&gt;Sign in with a passkey through form autofill | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;signal-api&quot; tabindex=&quot;-1&quot;&gt;Signal API &lt;a class=&quot;header-anchor&quot; href=&quot;#signal-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Signal API allows RPs to communicate the state of a credential back to the password manager. For example, if a user deletes their account or a public key on the server, the RP can signal this so the passkey can be removed or updated on the supporting password manager as well.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/identity/webauthn-signal-api&quot;&gt;Keep passkeys consistent with credentials on your server with the Signal API | Identity | Chrome for Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;related-origin-request&quot; tabindex=&quot;-1&quot;&gt;Related Origin Request &lt;a class=&quot;header-anchor&quot; href=&quot;#related-origin-request&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Related Origin Request allows a website to accept passkeys that were created for a different, but related, origin. This is useful for multi-domain deployments (e.g., &lt;code&gt;example.com&lt;/code&gt; and &lt;code&gt;shop.example&lt;/code&gt;) or country-specific deployments (e.g., &lt;code&gt;example.com&lt;/code&gt; and &lt;code&gt;example.co.jp&lt;/code&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-related-origin-requests&quot;&gt;Allow passkey reuse across your sites with Related Origin Requests | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://passkeys.dev/docs/advanced/related-origins&quot;&gt;Related Origin Requests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;get-client-capabilities&quot; tabindex=&quot;-1&quot;&gt;getClientCapabilities &lt;a class=&quot;header-anchor&quot; href=&quot;#get-client-capabilities&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;getClientCapabilities&lt;/code&gt; allows RPs to query the browser to see which WebAuthn features are supported on the current device. It helps in making decisions about the UX, such as checking if &lt;code&gt;conditional&lt;/code&gt; mediation is supported before setting up the form.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/webauthn-client-capabilities&quot;&gt;Simpler WebAuthn feature detection | web.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;client-hints&quot; tabindex=&quot;-1&quot;&gt;Client Hints &lt;a class=&quot;header-anchor&quot; href=&quot;#client-hints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Client Hints allows RPs to provide a hint to the browser about which type of authenticator the user is expected to use (e.g., &lt;code&gt;security-key&lt;/code&gt; or &lt;code&gt;client-device&lt;/code&gt;). This helps the browser to show a more relevant UI to the user, improving the user experience especially in enterprise environments where specific authenticators are required. Note that this is only a hint and does not enforce security policies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://passkeys.dev/docs/advanced/client-hints/&quot;&gt;Client Hints | passkeys.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;passkey-endpoints&quot; tabindex=&quot;-1&quot;&gt;Passkey endpoint &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-endpoints&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Passkey endpoint refers to a mechanism (often involving a &lt;code&gt;.well-known&lt;/code&gt; file) that allows RPs to signal to password managers (like Google Password Manager) that they support passkeys. This enables the password manager to proactively suggest upgrading an existing password account to a passkey.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/identity/passkeys/developer-guides/upgrades&quot;&gt;Promote passkey upgrades in Google Password Manager | Web guides | Google for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/passkey-endpoints/&quot;&gt;Passkey Endpoints&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;conditional-creation&quot; tabindex=&quot;-1&quot;&gt;Conditional creation &lt;a class=&quot;header-anchor&quot; href=&quot;#conditional-creation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Also known as &amp;quot;Automatic passkey upgrade&amp;quot; or &amp;quot;Automatic passkey creation&amp;quot;. An emerging feature that allows RPs to piggyback the passkey creation request onto a password sign-in or other user action. If the user successfully signs in with a password, the browser can automatically (or with minimal friction) create a passkey for future use.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/identity/webauthn-conditional-create&quot;&gt;Help users adopt passkeys more seamlessly | Identity | Chrome for Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 :=&quot;&quot; id=&quot;immediate-mediation&quot; tabindex=&quot;-1&quot;&gt;Immediate mediation &lt;a class=&quot;header-anchor&quot; href=&quot;#immediate-mediation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A proposed feature that immediately returns an error when a credential request is canceled or failed. This allows the RP to improve the user experience by not showing a QR code or other authentication methods and control the fallback authentication method.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/webauthn-immediate-mediation-ot&quot;&gt;Origin trial: WebAuthn immediate mediation for frictionless sign-in | Blog | Chrome for Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;finally&quot; tabindex=&quot;-1&quot;&gt;Finally &lt;a class=&quot;header-anchor&quot; href=&quot;#finally&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you think this article is missing any important keywords, please let me know via @agektmr.&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[Renewed the blog system]]></title>
  <link rel="alternate" type="text/html" href="/en/2025/11/blog-renewal.html" />
  <id></id>
  <published>2025-11-30T00:00:00Z</published>
  <updated>2025-11-30T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2025/11/blog-renewal.html</id>
  <content type="html">&lt;p&gt;I have revamped this blog. The appearance is almost the same, but I have introduced an English version with multilingual support (i18n) and changed the infrastructure.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;h2 id=&quot;background-of-the-renewal&quot; tabindex=&quot;-1&quot;&gt;Background of the renewal &lt;a class=&quot;header-anchor&quot; href=&quot;#background-of-the-renewal&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Until today, this blog has been serving technical information primarily in Japanese, but I was wanting to provide it in English too, for some time. There were some ideas in my mind on how to do it, but just couldn&#39;t find the time. With the recent rise of AI coding agents, I decided to jump on the bandwagon. Also, I haven&#39;t had much opportunity to write code for work lately, but I feel urged to understand, even just a little, what it feels like to be an every-day coder, so I decided to give it a try. I often use Gemini at work, so I decided to use Claude Code at this time, which many people around me use.&lt;/p&gt;
&lt;h2 id=&quot;main-changes&quot; tabindex=&quot;-1&quot;&gt;Main changes &lt;a class=&quot;header-anchor&quot; href=&quot;#main-changes&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1.-multilingual-support-(i18n)-and-url-structure-changes&quot; tabindex=&quot;-1&quot;&gt;1. Multilingual support (i18n) and URL structure changes &lt;a class=&quot;header-anchor&quot; href=&quot;#1.-multilingual-support-(i18n)-and-url-structure-changes&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The biggest change in this renewal is multilingual support. Until now, articles were mainly in Japanese, but English versions will also be available.&lt;/p&gt;
&lt;p&gt;Japanese articles have been placed directly under the root directory, but they are now separated into directories for each language as shown below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Japanese: &lt;code&gt;/ja/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;English: &lt;code&gt;/en/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This makes it easier to switch between languages. We&#39;ve also added a new language switch, so you can switch languages if an article exists.&lt;/p&gt;
&lt;h3 id=&quot;2.-automatic-translation-using-google-cloud-translation-api&quot; tabindex=&quot;-1&quot;&gt;2. Automatic translation using Google Cloud Translation API &lt;a class=&quot;header-anchor&quot; href=&quot;#2.-automatic-translation-using-google-cloud-translation-api&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For translation, I&#39;ve (asked to) add an automatic translation system using the Google Cloud Translation API, so I can translate using a script and I can make manual corrections as needed (past articles were translated mechanically in bulk, so I plan to correct any strange parts as they are found). This allows me to create a workflow that allows me to write articles in Japanese and then publish them in English with relatively little effort.&lt;/p&gt;
&lt;h3 id=&quot;3.-infrastructure-changes%3A-migrating-to-cloud-run&quot; tabindex=&quot;-1&quot;&gt;3. Infrastructure Changes: Migrating to Cloud Run &lt;a class=&quot;header-anchor&quot; href=&quot;#3.-infrastructure-changes%3A-migrating-to-cloud-run&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To support multiple languages, I switched my blog hosting from Jamstack Netlify to dynamic delivery by Google Cloud Run. Since the only server logic I needed was language detection, Firebase Hosting + Cloud Functions would have been fine, but I just wanted to try Cloud Run. I also wanted to get reacquainted with Docker, something I hate to learn and then forget (although I haven&#39;t actually reacquainted with it yet, since Claude Code did most of the heavy lifting for me).&lt;/p&gt;
&lt;h3 id=&quot;4.-introducing-organicity&quot; tabindex=&quot;-1&quot;&gt;4. Introducing organicity &lt;a class=&quot;header-anchor&quot; href=&quot;#4.-introducing-organicity&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As an added bonus, I&#39;ve introduced &amp;quot;organicity&amp;quot; as an indicator of how much of a blog post is written manually. For example, &amp;quot;organicity: 50%&amp;quot; means that 50% is written manually, meaning the remaining half relies on AI. I think this will become the norm in the future. However, this number is subjective and self-reported, so please take it as a grain of salt.&lt;/p&gt;
&lt;h2 id=&quot;future-outlook&quot; tabindex=&quot;-1&quot;&gt;Future outlook &lt;a class=&quot;header-anchor&quot; href=&quot;#future-outlook&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With this renewal, I have established the foundation for disseminating information in multiple languages. From now on, I would like to actively disseminate technical information not only in Japanese but also in English. If you find anything strange, please let me know.&lt;/p&gt;
&lt;p&gt;I hope you continue to enjoy my new blog.&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[I wrote a book called &quot;All About Passkeys.&quot;]]></title>
  <link rel="alternate" type="text/html" href="/en/2025/01/everything-about-passkeys.html" />
  <id></id>
  <published>2025-01-13T00:00:00Z</published>
  <updated>2025-01-13T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2025/01/everything-about-passkeys.html</id>
  <content type="html">&lt;p&gt;I have written a book called &amp;quot;All About Passkeys&amp;quot; (&lt;a href=&quot;https://gihyo.jp/book/2025/978-4-297-14653-5&quot;&gt;https://gihyo.jp/book/2025/978-4-297-14653-5&lt;/a&gt;). I would like to give you a brief introduction to the contents of this book, which will be released on January 28th.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;figure style=&quot;max-width: 400px; margin: 0 auto 30px;&quot;&gt;
      &lt;img src=&quot;/images/2025/everything-about-passkeys.jpg&quot; alt=&quot;パスキーのすべて&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;パスキーのすべて&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;I wrote &amp;quot;All About Passkeys&amp;quot; together with Mr. Koiwai, a director of the OpenID Foundation in the United States and leader of the OpenID Foundation Japan&#39;s KYC Working Group, and &lt;a href=&quot;https://x.com/kura_lab&quot;&gt;Kura&lt;/a&gt;, a director and evangelist at OpenID Foundation Japan. Mr. Koiwai also helped me with last year&#39;s &lt;a href=&quot;https://web.dev/blog/passkeys-hackathon-tokyo&quot;&gt;Passkey Hackathon&lt;/a&gt;, and we&#39;ve often spoken at the same events. He&#39;s been helping me out with various things recently, not just FIDO-related. Mr. Kura and I have been good friends in the ID community for over 10 years. We are both friendly and enjoyable colleagues. While we roughly divided the work, we all took responsibility for the overall writing. Toward the end, we all retreated to the Gijutsu Hyoronsha conference room several times to write and review the book, which made the process itself a lot of fun. I&#39;d like to thank Mr. Kikuchi, the editor, for his help, even on his day off.&lt;/p&gt;
&lt;p&gt;As the title suggests, this book covers not only the technical aspects of Passkey, but also its origins, ecosystem, surrounding circumstances, and more, incorporating all of our knowledge. For a rough overview, it&#39;s best to take a look at the &lt;a href=&quot;https://gihyo.jp/book/2025/978-4-297-14653-5#toc&quot;&gt;Table of Contents&lt;/a&gt;, but I&#39;d like to share some of my personal highlights.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contains basic information that PMs and designers need to know.&lt;/li&gt;
&lt;li&gt;Contains the essentials that engineers need to know to implement passkeys.&lt;/li&gt;
&lt;li&gt;Includes a wealth of information for advanced users.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;a-collection-of-basic-information-that-pms-and-designers-need-to-know&quot; tabindex=&quot;-1&quot;&gt;A collection of basic information that PMs and designers need to know &lt;a class=&quot;header-anchor&quot; href=&quot;#a-collection-of-basic-information-that-pms-and-designers-need-to-know&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;figure style=&quot;&quot;&gt;
      &lt;img src=&quot;/images/2025/introduction.jpg&quot; alt=&quot;はじめに&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;はじめに&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;This book is intended to be read by a wide range of members of teams working on passkeys, and contains a lot of information that will be useful for PMs and designers as well, such as what passkeys are, the benefits of using them, user experiences with passkeys, case studies, common misconceptions and their solutions, and pitfalls. In particular, the information on passkey support on each platform across operating systems, browsers, and password managers will be extremely useful when designing services.&lt;/p&gt;
&lt;figure style=&quot;&quot;&gt;
      &lt;img src=&quot;/images/2025/environment.jpg&quot; alt=&quot;サポート環境&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;サポート環境&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;p&gt;It also introduces the features and usage of widely used authentication methods such as passwords, two-factor authentication, and ID linking, and touches on what authentication methods other than passkeys are available, how they should be handled, and what to do if your passkey becomes unusable. Passkeys are not the only thing you need to consider when designing authentication functions.&lt;/p&gt;
&lt;h2 id=&quot;contains-the-essentials-that-engineers-need-to-know-to-implement-passkeys&quot; tabindex=&quot;-1&quot;&gt;Contains the essentials that engineers need to know to implement passkeys &lt;a class=&quot;header-anchor&quot; href=&quot;#contains-the-essentials-that-engineers-need-to-know-to-implement-passkeys&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This book provides various sample code, covering not only browser-side implementations and WebAuthn API references that align with the basic user experience, but also server-side implementation methods. It also introduces implementations for native Android and iOS apps, and provides sample code for iOS apps, for which there is little information available in Japanese.&lt;/p&gt;
&lt;figure style=&quot;&quot;&gt;
      &lt;img src=&quot;/images/2025/code-samples.jpg&quot; alt=&quot;パスキーのUXを実装する&quot; width=&quot;100%&quot; /&gt;
      &lt;figcaption&gt;パスキーのUXを実装する&lt;/figcaption&gt;
    &lt;/figure&gt;
&lt;h2 id=&quot;packed-with-information-for-advanced-users&quot; tabindex=&quot;-1&quot;&gt;Packed with information for advanced users &lt;a class=&quot;header-anchor&quot; href=&quot;#packed-with-information-for-advanced-users&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To encourage wider adoption of passkeys, various measures are required. To meet these needs, the book also contains a wealth of information for advanced users. It covers topics such as how to find out where passkeys are stored, how to use the same passkey for multiple domains, what attestation is, how to implement passkeys using security keys in the enterprise, details of credential payloads, and various extensions.&lt;/p&gt;
&lt;p&gt;Although the technology industry has a short shelf life, this book covers the latest specifications for WebAuthn Level 3, which is expected to become available in the near future, making it a book you can refer to with confidence for the next two years.&lt;/p&gt;
&lt;h2 id=&quot;lastly&quot; tabindex=&quot;-1&quot;&gt;lastly &lt;a class=&quot;header-anchor&quot; href=&quot;#lastly&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While passwords are easy to use, they have many pitfalls and require far too many precautions for anyone to use them safely, resulting in a constant stream of account hijacking. Passkeys, when implemented correctly, are easy for anyone to use and are an authentication feature that ensures security not possible with previous technology. While there is still room for growth, the time is ripe. Now is the time to start considering implementing passkeys.&lt;/p&gt;
&lt;p&gt;I usually share information about passkeys through events and social media as part of my job, and occasionally through this blog and magazines as a hobby. The reason I decided to try the book format this time was because I once again realized the comfort of having a medium that allows me to have comprehensive information at my fingertips. If you are learning about passkeys, I would encourage you to have this book at hand.&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[Tips for using your passkey]]></title>
  <link rel="alternate" type="text/html" href="/en/2024/12/passkeys-tips.html" />
  <id></id>
  <published>2024-12-26T00:00:00Z</published>
  <updated>2024-12-26T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2024/12/passkeys-tips.html</id>
  <content type="html">&lt;p&gt;Recently, I&#39;ve seen a lot of people complaining about passkeys being difficult to use. I&#39;ve also seen several posts from people who have trouble logging in to services they want to use because they can&#39;t find the passkeys they thought they had created.&lt;/p&gt;
&lt;p&gt;So in this blog post, I would like to consider why this happens, how to avoid such situations, what measures users can take, and what service providers can do to reduce the number of users who feel this way.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;p&gt;Of course, a basic premise is that features that require users to think hard to use are undesirable, as they will cause inconvenience rather than promote widespread adoption. However, while Passkey is maturing as a product from each company, it is still in the early stages of development as a total ecosystem, and it cannot be denied that there are some aspects that are difficult to use. Therefore, I am writing this article in the hope that by sharing some ingenuity, I can help ease the burden on everyone until the world becomes more user-friendly.&lt;/p&gt;
&lt;h2 id=&quot;passkey-basics&quot; tabindex=&quot;-1&quot;&gt;Passkey Basics &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-basics&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, I wrote about what Passkey is and what kind of world it aims to create in &lt;a href=&quot;https://blog.agektmr.com/2022/12/passkey&quot;&gt;What is Passkey and its Challenges?&lt;/a&gt;. It&#39;s been two years since I wrote that article, but the fundamentals haven&#39;t changed much. However, during that time, operating systems, passkey providers (password managers), browsers, and services (Relying Parties or RPs) have all gradually evolved.&lt;/p&gt;
&lt;h2 id=&quot;what-makes-passkeys-difficult-to-use%3F&quot; tabindex=&quot;-1&quot;&gt;What makes passkeys difficult to use? &lt;a class=&quot;header-anchor&quot; href=&quot;#what-makes-passkeys-difficult-to-use%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From what I&#39;ve observed, the main reasons people find passkeys difficult to use are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I created a passkey, but I can&#39;t find it.&lt;/li&gt;
&lt;li&gt;I don&#39;t know what to do when my passkey doesn&#39;t work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are probably many other minor issues, but if these are resolved, the remaining problems will likely be minor.&lt;/p&gt;
&lt;h2 id=&quot;passkey-not-found&quot; tabindex=&quot;-1&quot;&gt;Passkey not found &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-not-found&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&amp;quot;The service asked me to create a passkey, so I did, but it disappeared when I moved to another environment. I was told that the passkey would be synchronized, but I can&#39;t find it now.&amp;quot;&lt;/p&gt;
&lt;p&gt;This situation may occur for the following reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The passkey provider where you saved your passkey cannot be accessed from the new environment.&lt;/li&gt;
&lt;li&gt;The passkey provider is available, but you cannot access the account where you saved your passkey.&lt;/li&gt;
&lt;li&gt;The passkey from the passkey provider is not synchronized in the first place.&lt;/li&gt;
&lt;li&gt;The biometric authentication feature you thought was a passkey is not actually a passkey.&lt;/li&gt;
&lt;li&gt;You cannot log in because the service does not offer any authentication methods other than passkeys.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1.-the-passkey-provider-that-saved-the-passkey-cannot-be-accessed-from-the-new-environment.&quot; tabindex=&quot;-1&quot;&gt;1. The passkey provider that saved the passkey cannot be accessed from the new environment. &lt;a class=&quot;header-anchor&quot; href=&quot;#1.-the-passkey-provider-that-saved-the-passkey-cannot-be-accessed-from-the-new-environment.&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A passkey provider is a place where you can save and synchronize the passkeys you create, and in most cases, a &amp;quot;password manager&amp;quot; also serves this role. The default passkey provider where your passkeys are saved is determined by your environment. In most cases, the passkeys you create will be saved in the system&#39;s default passkey provider.&lt;/p&gt;
&lt;p&gt;If you can&#39;t find your passkey, it may be due to an incompatibility between your devices. For example, a passkey created in Edge for Windows cannot be accessed from Edge for Android. This is because the passkey created in Edge for Windows is stored in Windows Hello, while Edge for Android only works with Google Password Manager.&lt;/p&gt;
&lt;p&gt;The passkey provider support status for each environment is described below.&lt;/p&gt;
&lt;h3 id=&quot;2.-the-passkey-provider-is-available%2C-but-you-can&#39;t-access-the-account-where-the-passkey-is-stored&quot; tabindex=&quot;-1&quot;&gt;2. The passkey provider is available, but you can&#39;t access the account where the passkey is stored &lt;a class=&quot;header-anchor&quot; href=&quot;#2.-the-passkey-provider-is-available%2C-but-you-can&#39;t-access-the-account-where-the-passkey-is-stored&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Another possibility is that even if you use the same passkey provider, you can&#39;t find your passkey because you saved it in a different account. For example, if you create a passkey in Chrome, by default it&#39;s saved in the Google Password Manager linked to the &lt;a href=&quot;https://support.google.com/chrome/answer/185277?hl=ja&quot;&gt;Google Account you&#39;re logged in to Chrome with&lt;/a&gt;. If you want to access the same passkey in a different environment, you&#39;ll need to access it in Chrome logged in with the same Google Account. If you use multiple Google accounts, you might want to check whether the account you&#39;re using to access the passkey is the same one you saved previously.&lt;/p&gt;
&lt;p&gt;Android also has a feature called &lt;a href=&quot;https://support.google.com/work/android/answer/6191949?hl=ja&quot;&gt;Work Profile&lt;/a&gt; that completely separates apps and data for personal and work accounts within the same OS. I&#39;ve personally experienced panicked situations where I couldn&#39;t find my passkey because of this feature. If you can&#39;t access your passkey, please check the following.&lt;/p&gt;
&lt;h3 id=&quot;3.-the-passkey-provider&#39;s-passkey-is-not-synchronized-in-the-first-place&quot; tabindex=&quot;-1&quot;&gt;3. The passkey provider&#39;s passkey is not synchronized in the first place &lt;a class=&quot;header-anchor&quot; href=&quot;#3.-the-passkey-provider&#39;s-passkey-is-not-synchronized-in-the-first-place&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In fact, there are cases where passkeys are not synchronized. As of the end of 2024, passkeys will not be synchronized in the following three cases:&lt;/p&gt;
&lt;h4 id=&quot;created-a-passkey-for-windows-hello&quot; tabindex=&quot;-1&quot;&gt;Created a passkey for Windows Hello &lt;a class=&quot;header-anchor&quot; href=&quot;#created-a-passkey-for-windows-hello&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;One issue many people are likely to encounter is creating a passkey in Windows Hello. Previously, passkeys created in any browser were not synced, and even now, &lt;a href=&quot;https://developer.chrome.com/blog/passkeys-gpm-desktop?hl=ja&quot;&gt;with the exception of Chrome on TPM-enabled Windows devices&lt;/a&gt;, passkeys created in any browser are not synced once they are saved in Windows Hello.&lt;/p&gt;
&lt;h4 id=&quot;you-created-a-passkey-in-icloud-keychain-on-macos%2C-ios%2C-or-ipados-and-tried-to-access-the-passkey-from-a-non-apple-device&quot; tabindex=&quot;-1&quot;&gt;You created a passkey in iCloud Keychain on macOS, iOS, or iPadOS and tried to access the passkey from a non-Apple device &lt;a class=&quot;header-anchor&quot; href=&quot;#you-created-a-passkey-in-icloud-keychain-on-macos%2C-ios%2C-or-ipados-and-tried-to-access-the-passkey-from-a-non-apple-device&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When you create a passkey on macOS, iOS, or iPadOS, it&#39;s often stored in iCloud Keychain or the Passwords app. Passkeys stored in iCloud Keychain won&#39;t sync with Windows or Android as of the end of 2024, so they won&#39;t be available. There are Windows apps and browser extensions, so hopefully they&#39;ll support passkeys.&lt;/p&gt;
&lt;h4 id=&quot;i-created-a-passkey-for-a-service-that-i-don&#39;t-want-to-sync&quot; tabindex=&quot;-1&quot;&gt;I created a passkey for a service that I don&#39;t want to sync &lt;a class=&quot;header-anchor&quot; href=&quot;#i-created-a-passkey-for-a-service-that-i-don&#39;t-want-to-sync&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Android still has a FIDO2 feature that predates passkeys, which allows you to create passkeys that are not synchronized. Since passkeys should be synchronized, it may be more appropriate to simply call them &amp;quot;FIDO2 credentials.&amp;quot; Of course, this feature is no longer recommended, but it is still used intentionally by some services because it offers the strongest security.&lt;/p&gt;
&lt;h3 id=&quot;4.-the-biometric-authentication-feature-you-thought-was-a-passkey-is-actually-not-a-passkey&quot; tabindex=&quot;-1&quot;&gt;4. The biometric authentication feature you thought was a passkey is actually not a passkey &lt;a class=&quot;header-anchor&quot; href=&quot;#4.-the-biometric-authentication-feature-you-thought-was-a-passkey-is-actually-not-a-passkey&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When you encounter biometric authentication on your smartphone, you might immediately assume it&#39;s a passkey, but not all of them are passkeys. Android apps have a feature called &lt;a href=&quot;https://developer.android.com/reference/android/hardware/biometrics/BiometricManager&quot;&gt;BiometricManager&lt;/a&gt;, and iOS apps have a feature called &lt;a href=&quot;https://developer.apple.com/documentation/localauthentication&quot;&gt;Local Authentication Framework&lt;/a&gt;, so this may be a misunderstanding. These features can usually only be set up after logging in to a banking app or similar app using a different method.&lt;/p&gt;
&lt;h3 id=&quot;5.-i-can&#39;t-log-in-because-the-service-doesn&#39;t-offer-any-authentication-method-other-than-a-passkey&quot; tabindex=&quot;-1&quot;&gt;5. I can&#39;t log in because the service doesn&#39;t offer any authentication method other than a passkey &lt;a class=&quot;header-anchor&quot; href=&quot;#5.-i-can&#39;t-log-in-because-the-service-doesn&#39;t-offer-any-authentication-method-other-than-a-passkey&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Whether you use a passkey or not, as long as you can log in, that should be fine for the user. However, there are some services that, once you create a passkey, you cannot use any other authentication method. You might think that&#39;s outrageous, but let&#39;s stop and think about it for a moment.&lt;/p&gt;
&lt;p&gt;There are two points to consider when considering whether authentication methods other than passkeys should remain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If you leave authentication features weaker than a passkey, they will be targeted by attackers.&lt;/li&gt;
&lt;li&gt;Removing all authentication features weaker than a passkey will make your device safe, but removing the passkey will put you in trouble.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Approach 1: Preserve authentication mechanisms weaker than a passkey&lt;/p&gt;
&lt;p&gt;Adding a passkey as a new authentication option to your existing authentication methods doesn&#39;t fundamentally improve the security of the system as a whole, but the passkey experience has the advantage of being quicker and easier to log in with fewer steps than other secure authentication methods (such as two-factor authentication).&lt;/p&gt;
&lt;p&gt;Ideally, weak authentication functions should be strengthened or eventually eliminated while waiting for the passkey ecosystem to become more robust in the future. If authentication can be easily achieved with a passkey, even if other authentication methods require a little more effort, it is far better than being stuck with the loss of the passkey. With a passkey, existing authentication methods are positioned as merely useful in emergencies, and even if the experience is slightly worse, such as by increasing the number of authentication steps, it should be acceptable. It would be wise for many services to adopt this approach.&lt;/p&gt;
&lt;p&gt;Approach 2: Eliminate authentication mechanisms weaker than a passkey&lt;/p&gt;
&lt;p&gt;But what if your company&#39;s users were currently being subjected to brutal phishing scams, causing daily losses? It wouldn&#39;t be surprising if there were services that would completely switch to Passkey, which would reduce phishing scams, even if it meant users had some access issues and could recover by verifying their identity through support. &lt;a href=&quot;https://blog.agektmr.com/2023/12/passkey-mythbusting&quot;&gt;In our previous article, we listed services that support Passkey&lt;/a&gt;, but aren&#39;t you surprised that so many of them are major companies? Usually, it&#39;s small, ambitious companies that jump on new technologies; larger companies tend to be slow to act. Despite this, I imagine the major companies all supported Passkey because they wanted to quickly implement a countermeasure against phishing scams.&lt;/p&gt;
&lt;h2 id=&quot;tips-for-users-to-master-passkeys&quot; tabindex=&quot;-1&quot;&gt;Tips for users to master passkeys &lt;a class=&quot;header-anchor&quot; href=&quot;#tips-for-users-to-master-passkeys&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As we have seen, there are still pitfalls in Passkey as an ecosystem. Here are some suggestions on how general users can use Passkey in a positive way.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Display a QR code and attempt to log in with a passkey from another device (cross-device authentication)&lt;/li&gt;
&lt;li&gt;Be aware of which passkey provider you have saved your passkeys to&lt;/li&gt;
&lt;li&gt;Create passkeys for multiple passkey providers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tip 1: Display the QR code and try logging in with the passkey on another device (cross-device authentication)&lt;/p&gt;
&lt;p&gt;If you can&#39;t find your passkey, you may be able to log in using a passkey saved on another device. If the passkey dialog doesn&#39;t show &amp;quot;More options,&amp;quot; tap it to display a QR code, then scan it with the device that has your passkey to see if you can log in.&lt;/p&gt;
&lt;h3 id=&quot;tip-2%3A-be-aware-of-which-passkey-provider-you-store-your-passkeys-with&quot; tabindex=&quot;-1&quot;&gt;Tip 2: Be aware of which passkey provider you store your passkeys with &lt;a class=&quot;header-anchor&quot; href=&quot;#tip-2%3A-be-aware-of-which-passkey-provider-you-store-your-passkeys-with&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When creating a passkey, it&#39;s easier to understand the situation if you consider which passkey provider you&#39;re saving it in. Below is a summary of which passkey providers can be used in which environments.&lt;/p&gt;
&lt;p&gt;There are three main passkey providers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft&#39;s Windows Hello&lt;/li&gt;
&lt;li&gt;Apple&#39;s iCloud Keychain (or &amp;quot;Passwords&amp;quot; app)&lt;/li&gt;
&lt;li&gt;Google&#39;s Google Password Manager&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Browsers run on the operating systems of these platforms, but the passkey providers that can actually be used vary depending on the combination. Below we&#39;ve summarized which passkey provider your passkey is stored in for each operating system and major browser. We recommend that you find the combination that best suits the apps and browsers you access most frequently.&lt;/p&gt;
&lt;p&gt;For example: If you only use Apple devices, storing your passkey in iCloud Keychain may be sufficient, while Windows and iPhone users may want to use iCloud Keychain in conjunction with Google Password Manager.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;*I haven&#39;t checked all Chromium-based browsers, but I think most of them are probably the same as Edge. For the latest information, please refer to &lt;a href=&quot;https://passkeys.dev/device-support/&quot;&gt;passkeys.dev&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h4 id=&quot;windows&quot; tabindex=&quot;-1&quot;&gt;Windows &lt;a class=&quot;header-anchor&quot; href=&quot;#windows&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Edge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️ (Requires TPM)&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;macos&quot; tabindex=&quot;-1&quot;&gt;macOS &lt;a class=&quot;header-anchor&quot; href=&quot;#macos&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Edge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Safari&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;ios%2Fipados&quot; tabindex=&quot;-1&quot;&gt;iOS/iPadOS &lt;a class=&quot;header-anchor&quot; href=&quot;#ios%2Fipados&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Edge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Safari&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;△&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Coming soon&lt;/p&gt;
&lt;h4 id=&quot;android&quot; tabindex=&quot;-1&quot;&gt;Android &lt;a class=&quot;header-anchor&quot; href=&quot;#android&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Edge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;linux&quot; tabindex=&quot;-1&quot;&gt;Linux &lt;a class=&quot;header-anchor&quot; href=&quot;#linux&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Edge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Firefox&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;td&gt;❌️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;chromeos&quot; tabindex=&quot;-1&quot;&gt;ChromeOS &lt;a class=&quot;header-anchor&quot; href=&quot;#chromeos&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Chrome&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Password Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows Hello&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Keychain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;third-party-passkey-providers&quot; tabindex=&quot;-1&quot;&gt;Third-Party Passkey Providers &lt;a class=&quot;header-anchor&quot; href=&quot;#third-party-passkey-providers&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Other third-party passkey providers (non-default password managers) that support passkey include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1Password&lt;/li&gt;
&lt;li&gt;Dashlane&lt;/li&gt;
&lt;li&gt;BitWarden&lt;/li&gt;
&lt;li&gt;NordPass&lt;/li&gt;
&lt;li&gt;RoboForm&lt;/li&gt;
&lt;li&gt;Keeper&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The advantage of many third-party passkey providers is that they are platform-agnostic and can be used anywhere.&lt;/p&gt;
&lt;h3 id=&quot;tip-3%3A-create-passkeys-for-multiple-passkey-providers&quot; tabindex=&quot;-1&quot;&gt;Tip 3: Create passkeys for multiple passkey providers &lt;a class=&quot;header-anchor&quot; href=&quot;#tip-3%3A-create-passkeys-for-multiple-passkey-providers&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Depending on the service, passkeys are designed to allow multiple passkeys to be created for each account. Creating multiple passkeys across multiple passkey providers, such as Google Password Manager and iCloud Keychain, can significantly reduce the trouble of losing your passkey. Even if you accidentally delete your passkey, you can recover it using another passkey.&lt;/p&gt;
&lt;p&gt;Additionally, if you&#39;re using Android 14 or later, or iOS/iPadOS 16 or later, you can specify multiple third-party passkey providers at the OS level.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Android:&lt;/strong&gt; System Settings &amp;gt; Passwords &amp;amp; Accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iOS/iPadOS:&lt;/strong&gt; Settings &amp;gt; General &amp;gt; Autofill &amp;amp; Passwords&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even on desktop, most third-party passkey providers offer browser extensions that you can use, so this is a good opportunity to start using a third-party passkey provider.&lt;/p&gt;
&lt;p&gt;Tip 4: Wait until a passkey becomes more convenient&lt;/p&gt;
&lt;p&gt;Since things have been going in a rather negative direction, let me offer some positive news. Here are some upcoming changes (probably sometime in 2025) that will improve the usability of passkeys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Passkeys created in Chrome are currently stored in the Google Password Manager and can be synced across Android, Windows, macOS, Linux, and ChromeOS, and will soon be synced to iOS/iPadOS as well. This means that as long as you use Chrome, you&#39;ll be able to use the same passkey across all environments via Google Password Manager.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.windows.com/windowsdeveloper/2024/10/08/passkeys-on-windows-authenticate-seamlessly-with-passkey-providers/&quot;&gt;In October 2024, Microsoft announced that it plans to soon sync passkeys across Windows devices&lt;/a&gt;. It&#39;s likely that some movement will occur sometime in 2025.&lt;/li&gt;
&lt;li&gt;In October, the FIDO Alliance announced specifications called &lt;a href=&quot;https://fidoalliance.org/specifications-credential-exchange-specifications/&quot;&gt;CXP (Credential Exchange Protocol) and CXF (Credential Exchange Format)&lt;/a&gt; to enable the secure import and export of passkeys and passwords. This will enable passkeys to be copied and moved between passkey providers in the future.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hopefully, passkeys will be even more convenient to use in 2025!&lt;/p&gt;
&lt;h2 id=&quot;services-that-can-make-passkeys-more-convenient-to-use&quot; tabindex=&quot;-1&quot;&gt;Services that can make passkeys more convenient to use &lt;a class=&quot;header-anchor&quot; href=&quot;#services-that-can-make-passkeys-more-convenient-to-use&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Finally, we will consider what points service providers should pay attention to when implementing passkeys so that users can use them with confidence.&lt;/p&gt;
&lt;h3 id=&quot;let-users-know-which-passkeys-cannot-be-synced-and-which-passkey-providers-they-use&quot; tabindex=&quot;-1&quot;&gt;Let users know which passkeys cannot be synced and which passkey providers they use &lt;a class=&quot;header-anchor&quot; href=&quot;#let-users-know-which-passkeys-cannot-be-synced-and-which-passkey-providers-they-use&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.passkeycentral.org/ja/design-guidelines/optional-patterns/passkey-management-ui-best-practices-for-combining-all-passkey-types&quot;&gt;The Passkey Design Guidelines recommend creating a Passkey Management screen&lt;/a&gt;. You can help users understand by clearly indicating which Passkey provider stores the passkey and whether or not it is synchronized.&lt;/p&gt;
&lt;h3 id=&quot;adjust-passkey-promotion-frequency&quot; tabindex=&quot;-1&quot;&gt;Adjust passkey promotion frequency &lt;a class=&quot;header-anchor&quot; href=&quot;#adjust-passkey-promotion-frequency&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It seems that some users don&#39;t like the pressure to use a passkey. I think passkeys are a good thing, but pushing them too much may have the opposite effect.&lt;/p&gt;
&lt;h3 id=&quot;guide-to-authentication-methods-other-than-passkey&quot; tabindex=&quot;-1&quot;&gt;Guide to authentication methods other than passkey &lt;a class=&quot;header-anchor&quot; href=&quot;#guide-to-authentication-methods-other-than-passkey&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Unless there are extraordinary circumstances, provide a backup authentication method in case a passkey cannot be used. ID linking, two-step authentication, and in some cases passwordless methods such as magic links are also acceptable. Of course, you should take all possible security measures for each method. However, since password-only logins are vulnerable to attacks, you should move to ID linking, passwordless authentication, two-factor authentication, etc. as soon as possible.&lt;/p&gt;
&lt;h3 id=&quot;change-behavior-for-each-environment&quot; tabindex=&quot;-1&quot;&gt;Change behavior for each environment &lt;a class=&quot;header-anchor&quot; href=&quot;#change-behavior-for-each-environment&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For example, even for Windows, passkeys created in browsers other than Chrome will not be synchronized as of the end of 2024. By identifying the user agent string and explicitly stating that passkeys created in such browsers will not be synchronized, it may be possible to control user expectations to some extent.&lt;/p&gt;
&lt;h3 id=&quot;follow-the-guidelines&quot; tabindex=&quot;-1&quot;&gt;Follow the guidelines &lt;a class=&quot;header-anchor&quot; href=&quot;#follow-the-guidelines&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The FIDO Alliance recently launched a website called &lt;a href=&quot;https://www.passkeycentral.org/ja/home&quot;&gt;Passkey Central&lt;/a&gt;. It&#39;s not aimed at developers, but it contains many resources that product managers and designers can refer to. I highly recommend checking it out.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;summary &lt;a class=&quot;header-anchor&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ve put together a comprehensive guide to using passkeys. Some of you may feel like you can&#39;t master something so complicated! But as a user, that&#39;s not a bad feeling. The goal of passkeys is to provide a secure authentication system that anyone can use without having to think about these things at all. It may take a little more time until that happens.&lt;/p&gt;
&lt;p&gt;Finally, here are some tips that we&#39;ve covered in this article:&lt;/p&gt;
&lt;p&gt;Tips for users to use passkeys effectively:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilize cross-device authentication&lt;/li&gt;
&lt;li&gt;Be aware of which passkey providers you store your passkeys in&lt;/li&gt;
&lt;li&gt;Create passkeys for multiple passkey providers&lt;/li&gt;
&lt;li&gt;Wait until passkeys become more convenient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tips for service providers to successfully implement passkeys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adjust the frequency of passkey promotion&lt;/li&gt;
&lt;li&gt;Indicate the passkey provider and synchronization status of registered passkeys&lt;/li&gt;
&lt;li&gt;Keep authentication methods other than passkeys available if possible&lt;/li&gt;
&lt;li&gt;Change passkey creation behavior for each environment&lt;/li&gt;
&lt;li&gt;Follow guidelines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Have a great new year.&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[The basics of passkeys and clearing up misconceptions surrounding them]]></title>
  <link rel="alternate" type="text/html" href="/en/2023/12/passkey-mythbusting.html" />
  <id></id>
  <published>2023-12-18T00:00:00Z</published>
  <updated>2023-12-18T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2023/12/passkey-mythbusting.html</id>
  <content type="html">&lt;p&gt;2023 has undoubtedly become the &amp;quot;first year of passkeys.&amp;quot; With so many services supporting passkeys, 2024 is likely to be the year when passkeys finally become widespread.&lt;/p&gt;
&lt;p&gt;In this article, we will review the basics of passkeys and explain some common misconceptions about passkeys.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;p&gt;In 2023, many websites now support passkeys. For example:&lt;/p&gt;
&lt;p&gt;-Adobe&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon
-Apple&lt;/li&gt;
&lt;li&gt;eBay&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;KDDI&lt;/li&gt;
&lt;li&gt;Mercari&lt;/li&gt;
&lt;li&gt;Mixi&lt;/li&gt;
&lt;li&gt;MoneyForward&lt;/li&gt;
&lt;li&gt;Nintendo&lt;/li&gt;
&lt;li&gt;NTT Docomo
-PayPal&lt;/li&gt;
&lt;li&gt;Shopify&lt;/li&gt;
&lt;li&gt;Toyota
-Uber
-Yahoo! JAPAN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, this list is not exhaustive, but even just these should cover a large portion of the world&#39;s population, making it a huge leap forward. If you haven&#39;t tried Passkey yet, now is your chance to give it a try.&lt;/p&gt;
&lt;p&gt;That said, at this stage, the number of actual users is not the same as the covered population, and even from a developer&#39;s perspective, there is still room for improvement in the user experience and implementation, and it feels like it will take at least two or three years for it to mature. First of all, I am writing this article in the hope that as many people as possible will gain more accurate knowledge of passkeys.&lt;/p&gt;
&lt;p&gt;I would be delighted if Passkey could help create a world where logging in is no longer a barrier to using the latest technology, and where even someone like your mother can easily and securely use the functions of websites and apps without having to consult with an expert.&lt;/p&gt;
&lt;h2 id=&quot;passkey-basics&quot; tabindex=&quot;-1&quot;&gt;Passkey Basics &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-basics&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First, let&#39;s review the basics of passkeys. I&#39;ve created a short video summarizing passkeys, so please take a look. It&#39;s in English, but you can translate it and get Japanese subtitles.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/2xdV-xut7EQ&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;Simply put, a passkey is a mechanism that allows device owners to log in to websites and apps using a key stored on the device.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can create multiple passkeys for each site and app.&lt;/li&gt;
&lt;li&gt;When creating a passkey or logging in, local device authentication such as unlocking is required.&lt;/li&gt;
&lt;li&gt;Passkeys are stored in a password manager and can be synchronized across devices.&lt;/li&gt;
&lt;li&gt;By forcing users to use a password manager, users are less likely to fall victim to phishing scams.&lt;/li&gt;
&lt;li&gt;Since only public keys are stored on the RP (Relying Party) server, the chances of account login information being stolen are extremely low.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&#39;d like to go into more detail, I&#39;ve covered this topic twice on this blog, so please take a look.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.agektmr.com/2019/03/fido-webauthn&quot;&gt;How to Achieve a Password-Free World - Understanding the Basics of FIDO2 and WebAuthn&lt;/a&gt; (2019)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.agektmr.com/2022/12/passkey&quot;&gt;What is a Passkey and the Challenges It Faces&lt;/a&gt; (2022)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;clearing-up-misconceptions-about-passkeys&quot; tabindex=&quot;-1&quot;&gt;Clearing up misconceptions about passkeys &lt;a class=&quot;header-anchor&quot; href=&quot;#clearing-up-misconceptions-about-passkeys&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that we&#39;ve covered the basics of passkeys, we&#39;ll clear up some common misconceptions about passkeys.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;December 19, 2023: Misconceptions 10 to 13 have been added.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;December 21, 2023: The content of Misconceptions 10 and 11 has been revised for clarity.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;


&lt;h3 id=&quot;myth-1%3A-using-a-password-manager-is-enough-to-keep-me-safe%2C-so-there&#39;s-no-point-in-using-a-passkey&quot; tabindex=&quot;-1&quot;&gt;Myth 1: Using a password manager is enough to keep me safe, so there&#39;s no point in using a passkey &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-1%3A-using-a-password-manager-is-enough-to-keep-me-safe%2C-so-there&#39;s-no-point-in-using-a-passkey&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is true in a sense. The point of using a passkey is that it forces you to use a password manager.&lt;/p&gt;
&lt;p&gt;It&#39;s true that even if you continue to use passwords, if you use a password manager, it will automatically generate complex passwords for you, you don&#39;t have to remember them, and it will enter them into the appropriate domain, so you&#39;re less likely to fall victim to phishing scams.If you use it properly, you may not need a passkey.&lt;/p&gt;
&lt;p&gt;The problem is how to protect people who do not have the literacy to use password managers or who do not know how to use them. Password managers have been available for many years, but the number of password leaks and account hijackings has not decreased because the existence of such managers alone does not solve the problem.&lt;/p&gt;
&lt;p&gt;While websites and apps don&#39;t want to incur support costs for users who forget their passwords or have their two-factor authentication stolen through phishing, they can&#39;t force users to use a password manager. That&#39;s what Passkey does.&lt;/p&gt;
&lt;p&gt;KDDI reports that the introduction of passkeys has reduced authentication inquiries by 30%.&lt;/p&gt;
&lt;h3 id=&quot;myth-2%3A-if-i-lose-my-device%2C-will-my-passkey-become-useless%3F&quot; tabindex=&quot;-1&quot;&gt;Myth 2: If I lose my device, will my passkey become useless? &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-2%3A-if-i-lose-my-device%2C-will-my-passkey-become-useless%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Your synced passkey can be recovered even if you lose your device.&lt;/p&gt;
&lt;p&gt;In many cases, your passkey can be backed up to the password manager&#39;s server, so if you lose your device, you won&#39;t immediately be unable to log in again. If you can log in to the same password manager account on another (or new) device, you can restore your passkey. For example, if you lose your Android device, you can recover your saved passkey from another device as long as you can log in to your Google Account.&lt;/p&gt;
&lt;p&gt;To explain how synchronization works in more detail, for example, if you use Google Password Manager on Android, the saved passkey is encrypted using the device&#39;s PIN or pattern and backed up to Google&#39;s servers. When transferring to a new device, you first log in to your Google account, then enter the PIN or pattern from your old device to sync and decrypt the passkey and use it to log in. It&#39;s similar on Apple devices.&lt;/p&gt;
&lt;p&gt;If you lose your device and think it has fallen into the wrong hands, you may find it more reassuring to remotely wipe the entire device.&lt;/p&gt;
&lt;h3 id=&quot;misconception-3%3A-if-i-use-a-passkey%2C-can-someone-steal-my-account%3F&quot; tabindex=&quot;-1&quot;&gt;Misconception 3: If I use a passkey, can someone steal my account? &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-3%3A-if-i-use-a-passkey%2C-can-someone-steal-my-account%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Everyone has been thinking about why passkeys are vulnerable and coming up with various ideas. Of course, there is discussion about the problems that need to be solved and the problems that can be solved, but when people ask questions like, &amp;quot;What if your device is stolen?&amp;quot; or &amp;quot;What if someone cuts off your finger and authenticates you?&amp;quot;, the answer is often, &amp;quot;Passkeys don&#39;t prevent physical crimes.&amp;quot; It&#39;s a bit harsh to say that passkeys shouldn&#39;t be used for these reasons.&lt;/p&gt;
&lt;p&gt;Think about it.&lt;/p&gt;
&lt;p&gt;Which is better: continuing to use a password that is subject to endless, unknown remote attacks such as server leaks, phishing attacks, and list attacks, or a passkey that can only be attacked if the device is in your possession?&lt;/p&gt;
&lt;p&gt;Which is better: two-factor authentication, which requires a one-time password received via SMS or email, resulting in a worse login experience in exchange for security and leaving users vulnerable to remote phishing attempts, or a passkey that can only be used to log in to legitimate domains by unlocking the device?&lt;/p&gt;
&lt;p&gt;Although it&#39;s not perfect, the number of users protected by a passkey seems to be overwhelmingly large.&lt;/p&gt;
&lt;h3 id=&quot;myth-4%3A-i-don&#39;t-want-to-use-a-passkey-because-it-would-make-me-completely-dependent-on-big-tech-for-my-valuable-authentication.&quot; tabindex=&quot;-1&quot;&gt;Myth 4: I don&#39;t want to use a passkey because it would make me completely dependent on Big Tech for my valuable authentication. &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-4%3A-i-don&#39;t-want-to-use-a-passkey-because-it-would-make-me-completely-dependent-on-big-tech-for-my-valuable-authentication.&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Passkeys can be stored, synced, and used in a third-party password manager other than the default password manager provided by your OS vendor.&lt;/p&gt;
&lt;p&gt;By default, passkeys are stored in iCloud Keychain on Apple devices and Google Password Manager on Android devices. Fortunately, both Apple and Google offer a way for users to store and use passkeys in a third-party password manager, depending on the OS version. 1Password and Dashlane already support passkeys, so you can choose to use them if you need them.&lt;/p&gt;
&lt;p&gt;(Microsoft doesn&#39;t yet support passkey syncing, so it&#39;s unclear whether it will enable third-party password managers.)&lt;/p&gt;
&lt;p&gt;By the way, there is talk that if your Google or Apple account is banned, your passkey will also become unusable, but in many cases, the passkey is synced locally, so I think you can continue to log in using it (please check).&lt;/p&gt;
&lt;h3 id=&quot;myth-5%3A-if-my-password-manager-account-is-compromised%2C-all-my-passkeys-are-compromised-too&quot; tabindex=&quot;-1&quot;&gt;Myth 5: If my password manager account is compromised, all my passkeys are compromised too &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-5%3A-if-my-password-manager-account-is-compromised%2C-all-my-passkeys-are-compromised-too&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is not wrong, but it&#39;s worth understanding a few more details.&lt;/p&gt;
&lt;p&gt;It&#39;s a legitimate concern that if a password manager account that syncs passkeys is compromised, all of the stored passkeys could be stolen, making it dangerous.&lt;/p&gt;
&lt;p&gt;Google accounts can be compromised, and so can iCloud accounts. Third-party password managers like 1Password and Dashlane are also notoriously vulnerable.&lt;/p&gt;
&lt;p&gt;As mentioned above, Google Password Manager (and probably iCloud Keychain as well) encrypts and backs up your passkey using the device&#39;s PIN or pattern. Other password managers likely have their own similar mechanisms. Therefore, even if your account is stolen, it doesn&#39;t necessarily mean that your passkey will be leaked at the same time. It might be a good idea to check how the password manager you&#39;re using is designed just to be safe.&lt;/p&gt;
&lt;p&gt;You might think that if you don&#39;t sync your passkey, the problem is solved. That&#39;s true, but that also has its own problems. For example, if you switch to a new device, you&#39;ll need to create a new passkey for each site where you created a passkey on that device. However, you won&#39;t be able to link it to your account unless you authenticate once before that. So how can you authenticate without using a passkey?&lt;/p&gt;
&lt;p&gt;What you need to be careful about is that if you cannot log in using an authentication method that is equivalent to or more powerful than a passkey, that will create a hole.&lt;/p&gt;
&lt;p&gt;Also, if you create 100 passkeys, you will have to authenticate using a method other than the passkey and register a new passkey 100 times. Anyone who has ever broken a security key will know how painful this is.&lt;/p&gt;
&lt;p&gt;In that sense, I think that synchronizing passkeys is an excellent solution that can maintain a certain level of security without degrading the user experience.&lt;/p&gt;
&lt;p&gt;In addition, a new specification called &lt;a href=&quot;https://w3c.github.io/webauthn/#sctn-supplemental-public-keys-extension&quot;&gt;Supplemental Public Key&lt;/a&gt; has been created that combines the best of both passkey synchronization and device binding. This is a general-purpose alternative to the &lt;a href=&quot;/2022/12/passkey#dpk&quot;&gt;Device Public Key&lt;/a&gt; introduced in a previous article, but as this feature is implemented further in the future, it will be possible to create passkeys with even higher security.&lt;/p&gt;
&lt;h3 id=&quot;misconception-6%3A-is-a-passkey-more-secure-than-a-password-because-it-uses-biometric-information%3F&quot; tabindex=&quot;-1&quot;&gt;Misconception 6: Is a passkey more secure than a password because it uses biometric information? &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-6%3A-is-a-passkey-more-secure-than-a-password-because-it-uses-biometric-information%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Many people associate passkeys with biometric authentication based on their appearance, and this is one of the misconceptions that arises from this.&lt;/p&gt;
&lt;p&gt;The idea that passkeys are more secure and have higher entropy than passwords, which are typically only a few dozen characters, is that they use complex biometric information, but this is incorrect. The role of biometric authentication in passkey authentication is to trigger the issuance of a public key cryptographic signature.&lt;/p&gt;
&lt;p&gt;The passkey is based on public key cryptography, and is created by storing the public key on the RP (Relying Party) server and the private key in a password manager. The passkey here refers to this private key and its metadata.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/2023/security-keys.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When using a U2F-compatible security key for two-factor authentication, touching the metal chip on the surface is the trigger. This is because the requirement for physical contact prevents remote software spoofing. The same is true for two-factor authentication on some smartphones, where you must press the volume button instead of tapping the screen. Because the button is connected to the security chip inside the device, it can be proven that it was physically pressed.&lt;/p&gt;
&lt;p&gt;While U2F relies on proving someone&#39;s presence as the second factor, FIDO2 (passkey) uses device biometrics to at least verify that the person is the device owner. This is why biometric authentication can be used without biometric authentication, as long as you know a method to unlock the device, such as a PIN, passcode, or pattern. This is called user verification, and as mentioned in a recent blog post, it can be combined with proof of device ownership to form two-factor authentication in one step.&lt;/p&gt;
&lt;p&gt;By the way, on Android and iPhone, biometric information is stored in secure hardware such as the Secure Enclave, so the data cannot be extracted or sent over the network.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated 12/26/2024:&lt;/strong&gt; Over time, opinions have shifted regarding whether a passkey alone constitutes two-factor authentication. With FIDO2 authentication (authentication using WebAuthn, which predates passkeys), credentials were stored on a secure chip on the device, and local authentication reliably used the device&#39;s built-in features, making it undoubtedly two-factor authentication. However, with passkeys, credentials are stored in a password manager of the user&#39;s choosing, and local authentication is also specified by the password manager, making it unclear how reliable the local authentication certificate is. Some password managers, like 1Password, return the UV flag with &lt;code&gt;true&lt;/code&gt; even when skipping local authentication.&lt;/p&gt;
&lt;p&gt;Taking all of this into consideration, I have come to the conclusion that passkeys are not two-factor authentication. However, I don&#39;t think that just because they aren&#39;t two-factor authentication makes them weak. Rather, I understand that thanks to passkeys, the era of measuring strength based on whether or not it is two-factor authentication is over. For more details on this, I recommend reading &lt;a href=&quot;https://sizu.me/kkoiwai/posts/vrbdbodcbsub&quot;&gt;Koiwai&#39;s article&lt;/a&gt; and &lt;a href=&quot;https://herrjemand.medium.com/are-passkeys-mfa-f2720c983d5e&quot;&gt;Yuriy Ackermann&#39;s article&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;myth-7%3A-your-passkey-syncs-across-all-your-devices&quot; tabindex=&quot;-1&quot;&gt;Myth 7: Your passkey syncs across all your devices &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-7%3A-your-passkey-syncs-across-all-your-devices&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Passkey aims to create a world where it can be synchronized across various devices. However, due to technical reasons, not all Passkeys are yet capable of synchronization, and the original expression was &amp;quot;synchronize for each ecosystem (platform).&amp;quot; The actual synchronization conditions are as follows:&lt;/p&gt;
&lt;h4 id=&quot;safari&quot; tabindex=&quot;-1&quot;&gt;Safari &lt;a class=&quot;header-anchor&quot; href=&quot;#safari&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Apple&#39;s ecosystem is such that the Safari browser and almost all compatible apps run only on Apple devices, so whether you&#39;re using macOS, iOS, or iPadOS, the passkey you create is stored and synced to iCloud Keychain by default and can be used on other Apple devices, making it very simple. The same goes for iOS apps.&lt;/p&gt;
&lt;h4 id=&quot;chrome&quot; tabindex=&quot;-1&quot;&gt;Chrome &lt;a class=&quot;header-anchor&quot; href=&quot;#chrome&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Chrome works across multiple platforms, including macOS, iOS, iPadOS, Windows, Android, and Linux.&lt;/p&gt;
&lt;p&gt;Passkeys created on Apple devices, including macOS, are primarily stored in iCloud Keychain, so they sync in much the same way as Safari.&lt;/p&gt;
&lt;p&gt;Passkeys saved on Android are stored in Google Password Manager by default and sync across Android devices, with support for Chrome OS coming soon.&lt;/p&gt;
&lt;p&gt;For Windows, we rely on a Microsoft mechanism called Windows Hello, but unfortunately the Windows Hello passkey is not yet synced.&lt;/p&gt;
&lt;p&gt;As you can see, Chrome&#39;s sync support is currently dependent on the OS it&#39;s running on. This is documented by Google.&lt;/p&gt;
&lt;h4 id=&quot;firefox&quot; tabindex=&quot;-1&quot;&gt;Firefox &lt;a class=&quot;header-anchor&quot; href=&quot;#firefox&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Firefox, which uses Gecko, another of the three major browser engines, doesn&#39;t officially support passkeys, so it&#39;s not yet clear how passkeys will be synced, but it looks like it could happen by early 2024.&lt;/p&gt;
&lt;h4 id=&quot;third-party-password-managers&quot; tabindex=&quot;-1&quot;&gt;Third-Party Password Managers &lt;a class=&quot;header-anchor&quot; href=&quot;#third-party-password-managers&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;By the way, third-party password managers often have cross-platform compatibility, so synchronization is very flexible. In most cases, you can expect synchronization across all environments.&lt;/p&gt;
&lt;h4 id=&quot;passkey-authentication-using-qr-code&quot; tabindex=&quot;-1&quot;&gt;Passkey authentication using QR code &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-authentication-using-qr-code&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Even if your passkey is not synchronized and cannot be used, you can still log in using the passkey from another device by scanning the QR code.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/8D84Yosw-Ws&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;If you create a new passkey after this, you will be able to use it to log in in that environment from the next time.&lt;/p&gt;
&lt;h3 id=&quot;myth-8%3A-is-a-passkey-a-synced-fido-credential%3F&quot; tabindex=&quot;-1&quot;&gt;Myth 8: Is a passkey a synced FIDO credential? &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-8%3A-is-a-passkey-a-synced-fido-credential%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There is some confusion about the definition of a passkey, but I personally call any discoverable credential a passkey.&lt;/p&gt;
&lt;p&gt;The FIDO Alliance initially defined &amp;quot;passkey&amp;quot; as a FIDO credential that synchronizes, or in other words, a discoverable FIDO credential. (A discoverable credential is a saved passkey for a username that also triggers synchronization on Android.) However, this was later rewritten as &amp;quot;all FIDO credentials.&amp;quot; The Alliance also began to distinguish between a synchronized passkey and a device-bound passkey.&lt;/p&gt;
&lt;h3 id=&quot;misconception-9%3A-will-implementing-a-passkey-completely-eliminate-the-need-for-passwords%3F&quot; tabindex=&quot;-1&quot;&gt;Misconception 9: Will implementing a passkey completely eliminate the need for passwords? &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-9%3A-will-implementing-a-passkey-completely-eliminate-the-need-for-passwords%3F&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Because passkeys allow authentication without a password and are synchronized, ideally site operators would eliminate passwords as soon as possible after implementing passkeys, as leaving them open to attacks remains a possibility. However, there are many other things to consider before eliminating passwords.&lt;/p&gt;
&lt;p&gt;For example, there is no guarantee that a user will not delete their only passkey, and if that happens, you should carefully consider how to recover their account.&lt;/p&gt;
&lt;p&gt;There are several ways to recover your account without using a password, such as sending a one-time password via SMS, sending a magic link via email, or having the user contact support by phone. This process is called account recovery.&lt;/p&gt;
&lt;p&gt;As you may have already noticed, no matter how much security a passkey improves, if account recovery is easily targeted by attackers, the point of introducing a passkey is halved.&lt;/p&gt;
&lt;p&gt;At the same time as implementing a passkey, please also consider improving your authentication functions as a whole.&lt;/p&gt;
&lt;h3 id=&quot;misconception-10%3A-you-can-only-create-one-passkey&quot; tabindex=&quot;-1&quot;&gt;Misconception 10: You can only create one passkey &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-10%3A-you-can-only-create-one-passkey&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;How the passkey you create connects to websites and apps is one of the most confusing topics.&lt;/p&gt;
&lt;p&gt;It is a common misconception that there is only one passkey and that once registered, the same passkey will be used across all websites and applications.&lt;/p&gt;
&lt;p&gt;A passkey (public key pair) is created for each website and app account.&lt;/p&gt;
&lt;p&gt;It is a misconception that, like passwords, you can only create one passkey per website or app account.&lt;/p&gt;
&lt;p&gt;You can create multiple passkeys for each account. So, by creating multiple passkeys, such as one for Android, one for Windows, one for iCloud Keychain, and one for 1Password, you can create an environment where you can log in quickly from anywhere, and if you accidentally lose access to one of them, you can use the others as backups.&lt;/p&gt;
&lt;p&gt;However, most password managers only allow you to save one password for the same account, website, or app combination, so there&#39;s no benefit to having multiple passwords in the same password manager, and you&#39;ll usually get an error if you try.&lt;/p&gt;
&lt;h3 id=&quot;myth-11%3A-if-i-lose-access-to-the-google-or-icloud-account-i-use-for-syncing%2C-my-passkey-will-become-useless.&quot; tabindex=&quot;-1&quot;&gt;Myth 11: If I lose access to the Google or iCloud account I use for syncing, my passkey will become useless. &lt;a class=&quot;header-anchor&quot; href=&quot;#myth-11%3A-if-i-lose-access-to-the-google-or-icloud-account-i-use-for-syncing%2C-my-passkey-will-become-useless.&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As mentioned in Misconception 4, in many cases, passkeys are synced locally, so even if you lose access to your password manager account, you should be able to log in as long as the passkey remains locally. This is especially true for Google accounts and iCloud accounts, which generally remain locally (although I&#39;ve never actually had an account banned, so please check).&lt;/p&gt;
&lt;p&gt;If you find yourself in this situation and your passkey remains only locally, we recommend creating a new one using another password manager.&lt;/p&gt;
&lt;h3 id=&quot;misconception-12%3A-passkeys-can-only-be-used-on-smartphones&quot; tabindex=&quot;-1&quot;&gt;Misconception 12: Passkeys can only be used on smartphones &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-12%3A-passkeys-can-only-be-used-on-smartphones&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;It seems that more people than you might think think that a passkey requires a smartphone, but this is a misunderstanding.&lt;/p&gt;
&lt;p&gt;Passkey is also supported on desktops and laptops. Many devices don&#39;t support biometric authentication, but in those cases, you can use local authentication with a PIN (Windows) or a system password (macOS) to authenticate using the passkey.&lt;/p&gt;
&lt;p&gt;I mentioned that if you only have a passkey on your smartphone, you can authenticate using a QR code, but if you then create a new passkey in your desktop environment, you will be able to log in using only your computer from then on, without having to scan the QR code every time.&lt;/p&gt;
&lt;h3 id=&quot;misconception-13%3A-creating-a-passkey-prevents-other-authentication-methods-from-working&quot; tabindex=&quot;-1&quot;&gt;Misconception 13: Creating a passkey prevents other authentication methods from working &lt;a class=&quot;header-anchor&quot; href=&quot;#misconception-13%3A-creating-a-passkey-prevents-other-authentication-methods-from-working&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;No service I&#39;ve seen has ever removed all other authentication methods in favor of making a passkey available.&lt;/p&gt;
&lt;p&gt;Therefore, there is no need to worry about creating a passkey and being locked out. In most cases, you should still be able to use the same login method as before. Why not give it a try?&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;summary &lt;a class=&quot;header-anchor&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I hope this article clarifies some of your questions about passkeys. If you have any questions that aren&#39;t answered here, please let me know at &lt;a href=&quot;https://twitter.com/agektmr&quot;&gt;@agektmr&lt;/a&gt; and I might add them to this article.&lt;/p&gt;
&lt;p&gt;Finally, here are some resources for those who want to keep track of Passkey information:&lt;/p&gt;
&lt;h3 id=&quot;google-related&quot; tabindex=&quot;-1&quot;&gt;Google related &lt;a class=&quot;header-anchor&quot; href=&quot;#google-related&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://goo.gle/passkeys&quot;&gt;&lt;strong&gt;Google&#39;s Official Passkey Developer Documentation&lt;/strong&gt;&lt;/a&gt;: Contains an overview of passkeys, UX guides, case studies, and other passkey-related information for both Android app and web developers. (The Japanese text is machine-translated, but there&#39;s a bug where the left navigation isn&#39;t up to date when translated into Japanese. Please temporarily switch to English to get the full picture.)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://goo.gle/passkeys-web&quot;&gt;&lt;strong&gt;Google&#39;s Official Passkey Developer Documentation&lt;/strong&gt;&lt;/a&gt;: Contains passkey-related information for web developers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/training/sign-in/passkeys&quot;&gt;&lt;strong&gt;Android Developer Documentation&lt;/strong&gt;&lt;/a&gt;: Contains passkey-related information for Android developers. Going forward, all Android app authentication will be migrated to a library called Credential Manager, so this information is part of that documentation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/g/google-passkeys-developer-newsletter/&quot;&gt;&lt;strong&gt;Passkey Developer Newsletter&lt;/strong&gt;&lt;/a&gt;: Receive email notifications of updates to Google-related passkey implementations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fido-alliance-related&quot; tabindex=&quot;-1&quot;&gt;FIDO Alliance Related &lt;a class=&quot;header-anchor&quot; href=&quot;#fido-alliance-related&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/?lang=ja&quot;&gt;FIDO Alliance Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fidoalliance.org/ux-guidelines/&quot;&gt;FIDO Alliance Official UX Guide&lt;/a&gt; (English)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://passkeys.dev/&quot;&gt;Community-Driven Passkey Documentation&lt;/a&gt; (English)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@tierramallorca?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&quot;&gt;Tierra Mallorca&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/photos/white-and-red-wooden-house-miniature-on-brown-table-rgJ1J8SDEAY?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[What is a passkey and its challenges?]]></title>
  <link rel="alternate" type="text/html" href="/en/2022/12/passkey.html" />
  <id></id>
  <published>2022-12-13T00:00:00Z</published>
  <updated>2022-12-13T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2022/12/passkey.html</id>
  <content type="html">&lt;p&gt;Passkeys are a new authentication method that is resistant to phishing and easy to use even for non-tech-savvy users, and are said to eventually replace passwords. In this article, we&#39;ll summarize the basics of passkeys and what they mean for the future of the web.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;h2 id=&quot;what-is-a-passkey%3F&quot; tabindex=&quot;-1&quot;&gt;What is a passkey? &lt;a class=&quot;header-anchor&quot; href=&quot;#what-is-a-passkey%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On December 9, 2022, Google announced that Chrome for Android now supports passkeys. Apple has also already added support for passkeys in Safari on the latest versions of macOS Ventura and iOS/iPadOS 16.&lt;/p&gt;
&lt;p&gt;Passkey is the name of the &lt;a href=&quot;/2019/03/fido-webauthn.html&quot;&gt;FIDO credential&lt;/a&gt; jointly used by Apple, Google, and Microsoft. The brand and icon &amp;quot;Passkey&amp;quot; were decided upon to allow end users to recognize it as a password-less, intuitive way to log in. From a web developer perspective, it can be safely considered an extension of &lt;a href=&quot;https://w3c.github.io/webauthn&quot;&gt;WebAuthn (Web Authentication)&lt;/a&gt;, defined by the &lt;a href=&quot;https://fidoalliance.org/&quot;&gt;FIDO Alliance&lt;/a&gt; and W3C. In this article, &amp;quot;Passkey&amp;quot; is replaced with &amp;quot;FIDO credential.&amp;quot; I previously wrote an article about FIDO and WebAuthn, so if you haven&#39;t already, I recommend you read it.&lt;/p&gt;
&lt;p&gt;At first glance, a passkey is a biometric login experience, but if you&#39;re a techie, it&#39;s worth knowing what&#39;s going on behind the scenes.&lt;/p&gt;
&lt;h3 id=&quot;user-experience&quot; tabindex=&quot;-1&quot;&gt;User Experience &lt;a class=&quot;header-anchor&quot; href=&quot;#user-experience&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Before users can log in with a passkey, they must create one for each site.&lt;/p&gt;
&lt;p&gt;When you try to create or register a passkey, a biometric authentication dialog box will pop up and you will be asked to perform &lt;a href=&quot;#luv&quot;&gt;local authentication&lt;/a&gt;. Once authentication is complete, a new passkey will be created.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/lZXGXxZIMTU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;When you log in, an account selector will be displayed. Select the account you want to use and tap to perform local authentication and complete the login process.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/6GMDhF1eQOQ&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;The passkey is synchronized, so it can be used on other devices. If the environment does not allow passkey synchronization, you can log in across devices.&lt;/p&gt;
&lt;p&gt;When logging in, the browser will display a menu like &amp;quot;Log in on another device.&amp;quot; Tap this to display a QR code. Scanning it with your smartphone will perform local authentication, and once complete, you will automatically be logged in on your desktop.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/8D84Yosw-Ws&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;Chrome will remember your device, so you can tap the device name to specify it without having to scan the QR code the second time. Of course, if you create a new passkey on your desktop after that, you&#39;ll be able to log in even without your smartphone.&lt;/p&gt;
&lt;p&gt;You can try it out for yourself by watching the demo here.&lt;/p&gt;
&lt;h2 id=&quot;why-passkeys-are-better-than-passwords&quot; tabindex=&quot;-1&quot;&gt;Why passkeys are better than passwords &lt;a class=&quot;header-anchor&quot; href=&quot;#why-passkeys-are-better-than-passwords&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 :#phishing=&quot;&quot; id=&quot;passkeys-are-phishing-resistant&quot; tabindex=&quot;-1&quot;&gt;Passkeys are phishing resistant &lt;a class=&quot;header-anchor&quot; href=&quot;#passkeys-are-phishing-resistant&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The domain of the site where the passkey was created is stored as metadata along with the credentials. Therefore, authentication cannot be performed unless the domain matches. This makes phishing virtually impossible, and also has the benefit of freeing users from having to worry about URLs.&lt;/p&gt;
&lt;h3 id=&quot;luv&quot; tabindex=&quot;-1&quot;&gt;Passkey authentication is done locally &lt;a class=&quot;header-anchor&quot; href=&quot;#luv&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Local authentication with a passkey is resistant to remote attacks.&lt;/p&gt;
&lt;p&gt;When you create a passkey or log in with it, you authenticate using the same method you use to unlock your device&#39;s screen lock: fingerprint, facial recognition, or a PIN or pattern on Android; Touch ID, Face ID, or a passcode on iOS/iPadOS; Touch ID or a password on macOS; and Windows Hello or a PIN on Windows. This authentication occurs on the user&#39;s device, rather than sending credentials directly to the network, and is called &amp;quot;local authentication.&amp;quot;&lt;/p&gt;
&lt;p&gt;When you create a passkey, local authentication triggers the creation of a new public key pair, with the private key stored on the device and the public key stored on the server. The passkey essentially refers to this private key and its metadata. The passkey is then synchronized and can be used on other devices.&lt;/p&gt;
&lt;p&gt;With a password, remote authentication is performed by sending the string entered by the user to the server, but with a passkey login, local authentication is triggered to generate a signature, which is then sent to the server. The server then verifies the signature using the public key stored when the passkey was created, and authenticates it.&lt;/p&gt;
&lt;p&gt;Have you noticed that authentication is performed twice in total: local authentication and signature verification on the server? In other words, the passkey alone performs two-factor authentication: biometric authentication (or knowledge authentication) and possession authentication. This is because, unlike a password, a passkey is strong on its own, is difficult to leak, and cannot be reused.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&lt;strong&gt;Updated 12/26/2024:&lt;/strong&gt; Over time, opinions have shifted regarding whether a passkey alone constitutes two-factor authentication. With FIDO2 authentication (authentication using WebAuthn, which predates passkeys), credentials were stored on a secure chip on the device, and local authentication reliably used the device&#39;s built-in features, making it undoubtedly two-factor authentication. However, with passkeys, credentials are stored in a password manager of the user&#39;s choosing, and local authentication is also specified by the password manager, making it unclear how reliable the local authentication certificate is. Some password managers, like 1Password, return the UV flag with &lt;code&gt;true&lt;/code&gt; even when skipping local authentication.&lt;/p&gt;
&lt;p&gt;Taking all of this into consideration, I have come to the conclusion that passkeys are not two-factor authentication. However, I don&#39;t think that just because they aren&#39;t two-factor authentication makes them weak. Rather, I understand that thanks to passkeys, the era of measuring strength based on whether or not it is two-factor authentication is over. For more details on this, I recommend reading &lt;a href=&quot;https://sizu.me/kkoiwai/posts/vrbdbodcbsub&quot;&gt;Koiwai&#39;s article&lt;/a&gt; and &lt;a href=&quot;https://herrjemand.medium.com/are-passkeys-mfa-f2720c983d5e&quot;&gt;Yuriy Ackermann&#39;s article&lt;/a&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;synchronization&quot; tabindex=&quot;-1&quot;&gt;Passkeys can be synchronized across devices &lt;a class=&quot;header-anchor&quot; href=&quot;#synchronization&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The greatest feature of Passkey is that it can be synchronized across devices.&lt;/p&gt;
&lt;p&gt;With traditional FIDO, credentials created on one device could only be used on that same device. This meant that remote attacks were impossible, meaning that an attacker had no power unless they had physical access to the target device. However, this posed problems &lt;a href=&quot;#security&quot;&gt;in terms of both usability and security&lt;/a&gt; when migrating to a new device. Passkey synchronization completely solves these problems.&lt;/p&gt;
&lt;p&gt;However, passkey synchronization is limited to within the same ecosystem. &amp;quot;Same ecosystem&amp;quot; refers to the password managers and other mechanisms of each platform, such as those of Google, Apple, and Microsoft. For example, passkeys are synchronized via iCloud Keychain for Apple and Google Password Manager for Google (it is unclear whether Microsoft will officially support passkeys as of December 2022).&lt;/p&gt;
&lt;p&gt;Because Apple is vertically integrated, Safari won&#39;t work on devices other than Apple devices, and all syncing is primarily based on your Apple ID via iCloud Keychain. Google Chrome syncs between Android devices using Google Password Manager based on your Google Account, but passkeys aren&#39;t synced on other operating systems. Google has stated that it plans to sync passkeys using Apple and Microsoft&#39;s ecosystems once their sync APIs are available.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Android has also stated that it will support third-party password managers syncing passkeys in the future, so password managers that have announced passkey support, such as 1Password, may become available on Android.&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;account-selector&quot; tabindex=&quot;-1&quot;&gt;Account selector can be used &lt;a class=&quot;header-anchor&quot; href=&quot;#account-selector&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Although technically this feature has been available in Safari and desktop Chrome for some time, Android&#39;s support for it has made the account selector feature a prime example of passkey usage. In WebAuthn, this is called Discoverable Credentials (formerly &lt;a href=&quot;/2019/03/fido-webauthn.html#resident-key&quot;&gt;Resident Key&lt;/a&gt;), and it stores user information as metadata in the passkey, enabling the account selector UI. Users can log in simply by tapping to select an account and using local authentication, without having to type their username. This significantly improves usability for users who often forget their usernames, let alone their passwords.&lt;/p&gt;
&lt;h3 id=&quot;sign-in-with-a-phone&quot; tabindex=&quot;-1&quot;&gt;Sign in with a smartphone &lt;a class=&quot;header-anchor&quot; href=&quot;#sign-in-with-a-phone&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is the feature that allows you to log in using your smartphone, which was explained in the user experience section.&lt;/p&gt;
&lt;p&gt;Google Accounts have long had the ability to register your smartphone as a security key for two-factor authentication. This feature is FIDO-compliant and has been expanded to include more than just Google Accounts. This is the feature that lets you log in from another browser via a QR code. It was previously called caBLE, but has now been renamed hybrid.&lt;/p&gt;
&lt;p&gt;Because Hybrid was originally intended as a standard, a similar feature was implemented in Safari at the same time as Passkey, allowing you to log in to Safari on macOS using your Android device, and to log in to Chrome on Windows using your iPhone.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Google&#39;s two-factor authentication has a similar feature, &lt;a href=&quot;https://support.google.com/accounts/answer/6361026?hl=ja&quot;&gt;send a push notification to allow login&lt;/a&gt;, but it&#39;s its own unique mechanism.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;passkey-considerations&quot; tabindex=&quot;-1&quot;&gt;Passkey Considerations &lt;a class=&quot;header-anchor&quot; href=&quot;#passkey-considerations&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;privacy&quot; tabindex=&quot;-1&quot;&gt;Privacy &lt;a class=&quot;header-anchor&quot; href=&quot;#privacy&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When a website suddenly requires biometric authentication, I think many end users wonder where their fingerprint or facial information goes. Especially as passkeys become more common and users are still getting used to them, it&#39;s only natural to feel fear that fingerprint or facial information might be collected and monitored, or that it could fall into the wrong hands if the service is hacked and leaked.&lt;/p&gt;
&lt;p&gt;FIDO has a rule that biometric information must be stored on the authenticator device and must not be sent to a server, etc., so you can rest assured that this rule will be observed at least as long as you use a FIDO Certified authenticator (this includes Android. iPhones are probably included as well, but I couldn&#39;t find the source).&lt;/p&gt;
&lt;p&gt;Additionally, the information used to create a passkey and passed to the service is a public key and a credential ID, both of which are meaningless byte sequences issued per site. The credential ID is used to limit the authenticators that can be used during authentication and to search for a public key that matches the signature authenticated by the server. The public key is used to verify the signature sent during authentication. Therefore, unless the passkey is registered in combination with personal information such as the user&#39;s email address or name, it is not possible to track users across sites using the passkey.&lt;/p&gt;
&lt;p&gt;Passkeys may be an authentication method that poses a high psychological hurdle for end users, especially in the early stages, so I think service providers need to provide reassuring measures that address this.&lt;/p&gt;
&lt;h3 id=&quot;security&quot; tabindex=&quot;-1&quot;&gt;Is passkey synchronization the right thing to do? &lt;a class=&quot;header-anchor&quot; href=&quot;#security&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;FIDO is based on possession authentication using public key cryptography. The key point is that it is difficult to break the authentication unless you have physical access to the authenticator. However, passkeys can be synchronized and used on multiple devices. This has raised concerns that this could deviate from AAL3 (Authenticator Assurance Level 3) defined in &lt;a href=&quot;https://pages.nist.gov/800-63-3-Implementation-Resources/63B/AAL/&quot;&gt;NIST SP800-63B&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, if we only accept credentials that are tightly bound to the device, when migrating to a new device:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You must transfer all accounts for which you have created credentials.&lt;/li&gt;
&lt;li&gt;You must log in to your new device using a non-FIDO method that is vulnerable to phishing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are problems such as:&lt;/p&gt;
&lt;p&gt;Leaving aside the question of continuing to use passwords, the question is whether to choose traditional FIDO credentials, which are inconvenient and leave authentication methods vulnerable to phishing, or passkeys, which are more convenient but pose slightly increased risks. I think it&#39;s best to choose based on your needs.&lt;/p&gt;
&lt;p&gt;For example, for consumer services such as social media or news apps, the economic damage would not be so great even if an account were to be hijacked, so it would be wise to choose the convenience of a passkey.&lt;/p&gt;
&lt;p&gt;On the other hand, enterprises that handle confidential information, or banks and wallet apps that handle money, may want to keep their devices linked to their devices even if it is slightly less convenient, as there is a possibility of significant economic damage.&lt;/p&gt;
&lt;p&gt;In Chrome, if you enable Discoverable Credentials and create a passkey, it will be synced, but if you disable it and create a passkey, it will not be synced as a traditional FIDO credential. In Safari, all credentials are synced as passkeys, which may make it difficult to use in enterprises (perhaps the solution is to use a security key for two-factor authentication).&lt;/p&gt;
&lt;h3 id=&quot;dpk&quot; tabindex=&quot;-1&quot;&gt;Device Public Key &lt;a class=&quot;header-anchor&quot; href=&quot;#dpk&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Another option proposed is the &lt;a href=&quot;https://w3c.github.io/webauthn/#sctn-device-publickey-extension&quot;&gt;Device Public Key Extension&lt;/a&gt;, which combines the advantages of a passkey and a device-bound FIDO credential. This creates another device-specific public key pair along with the passkey, allowing the server to detect whether the passkey is already registered on the device. It is expected that this will combine the advantages of both the ease of use of a passkey and the advantages of a device-bound FIDO credential.&lt;/p&gt;
&lt;p&gt;However, while Device Public Key is currently planned for implementation on Android, there has been no announcement yet as to whether it will be available on Apple devices. We will be keeping an eye on future developments, including Microsoft&#39;s actions.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;summary &lt;a class=&quot;header-anchor&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With the introduction of Passkey, FIDO has finally entered the practical stage. In addition to the issues mentioned above, there are still issues remaining, such as &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1530370&quot;&gt;Firefox not supporting it&lt;/a&gt; and the need for further improvement in the synchronization environment, but these are likely to be resolved with time. Some services, such as &lt;a href=&quot;https://newsroom.paypal-corp.com/2022-10-24-PayPal-Introduces-More-Secure-Payments-with-Passkeys&quot;&gt;PayPal&lt;/a&gt; and &lt;a href=&quot;https://support.yahoo-net.jp/SccLogin/s/article/H000004626&quot;&gt;Yahoo! JAPAN&lt;/a&gt;, have already deployed it in practice.&lt;/p&gt;
&lt;p&gt;Here are some resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Official Google documentation: &lt;a href=&quot;https://goo.gle/passkeys&quot;&gt;Passwordless login with passkeys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Official Apple documentation: &lt;a href=&quot;https://developer.apple.com/documentation/authenticationservices/authenticating_a_user_through_a_web_service&quot;&gt;Authenticating a User Through a Web Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/passkey-registration/&quot;&gt;Create a passkey for passwordless logins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/passkey-form-autofill/&quot;&gt;Sign in with a passkey through form autofill&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We expect the implementation of Passkey to accelerate even further in 2023.&lt;/p&gt;
&lt;h2 id=&quot;devfest-%26-android-dev-summit-japan-2022-will-be-held&quot; tabindex=&quot;-1&quot;&gt;DevFest &amp;amp; Android Dev Summit Japan 2022 will be held &lt;a class=&quot;header-anchor&quot; href=&quot;#devfest-%26-android-dev-summit-japan-2022-will-be-held&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Finally, a little promotion: &lt;a href=&quot;https://developersonair.withgoogle.com/events/adsjapan_2022&quot;&gt;DevFest &amp;amp; Android Dev Summit Japan 2022&lt;/a&gt; will be held at the Google office this Friday, December 16th. In addition to web, there will be many sessions on Flutter, Firebase, and Android.&lt;/p&gt;
&lt;p&gt;Just for the web section, we have an impressive lineup of speakers scheduled to speak, including Google Developers Experts Yoshiko and Yagura, Chrome team PM Kenji Baheux, Chrome Developer Relations team lead Paul Kinlan, and teammates Milica Mihajlija, Adriana Jara, and Jhey Tompkins. I&#39;ll also be talking about passkeys, the subject of this article.&lt;/p&gt;
&lt;p&gt;If you have any in-depth questions about any of the sessions, please come and talk to us in person. Since it&#39;s a hybrid event, you can also watch the live stream by registering here. We look forward to seeing you there!&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href=&quot;https://unsplash.com/@fess0?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Filip Szalbot&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/keys?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[SharedArrayBuffer and the transitional story of cross-origin isolation]]></title>
  <link rel="alternate" type="text/html" href="/en/2021/11/cross-origin-isolation.html" />
  <id></id>
  <published>2021-11-04T00:00:00Z</published>
  <updated>2021-11-04T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2021/11/cross-origin-isolation.html</id>
  <content type="html">&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&lt;strong&gt;2021/12/26:&lt;/strong&gt; &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_2-release-notes&quot;&gt;Safari also now supports &lt;code&gt;SharedArrayBuffer&lt;/code&gt; using COOP/COEP from version 15.2&lt;/a&gt;, so we have changed the notation in the relevant section.&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;This is a long article, so I&#39;ll start with the conclusion.&lt;/p&gt;
&lt;p&gt;Chrome, Firefox, and Safari now support &lt;code&gt;SharedArrayBuffer&lt;/code&gt; and high-resolution timers. To do so, enable cross-origin isolation, which sends the following two headers to the parent HTML document:&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Embedder-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;require-corp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Opener-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, there are various conditions and restrictions to enable this, and many sites will struggle at this stage. If you just want to continue using Chrome as usual for the time being, it may be a safe option to sign up for the &lt;a href=&quot;https://developer.chrome.com/origintrials/#/view_trial/303992974847508481&quot;&gt;Deprecation Trial&lt;/a&gt; and see how it goes for a while.&lt;/p&gt;
&lt;!-- excerpt --&gt;
&lt;p&gt;Spectre threats, browser countermeasures, and site isolation&lt;/p&gt;
&lt;p&gt;In our previous article, we discussed the Spectre threat, which exposes cross-origin resources by inferring the memory space used by the same process. We noted that browsers have mitigated the risk by disabling &lt;code&gt;SharedArrayBuffer&lt;/code&gt; or reducing the precision of high-resolution timers. We also noted that some browsers have implemented a more fundamental solution by introducing an architecture called Site Isolation. We also noted that standardized features can isolate resources from cross-origin page attacks and ensure their safety. Specifically, various HTTP headers, such as CORP, &lt;code&gt;X-Content-Type-Options&lt;/code&gt;, &lt;code&gt;X-Frame-Options&lt;/code&gt;, CSP &lt;code&gt;frame-ancestors&lt;/code&gt;, and COOP, are used to protect resources before they reach the renderer process.&lt;/p&gt;
&lt;p&gt;Browsers that adopt Site Isolation can now use &lt;code&gt;SharedArrayBuffer&lt;/code&gt; and high-resolution timers again, but even if all browsers support Site Isolation, is it healthy for the web if these features are only available or unavailable depending on the architecture?&lt;/p&gt;
&lt;p&gt;That&#39;s where cross-origin isolation comes in. It&#39;s a combination of HTTP headers that allows the browser to determine that it is in a safe environment (cross-origin isolated) from other origins, enabling things like &lt;code&gt;SharedArrayBuffer&lt;/code&gt; and high-resolution timers.&lt;/p&gt;
&lt;p&gt;This article explains how to enable cross-origin isolation, the challenges it poses, and next steps.&lt;/p&gt;
&lt;h2 id=&quot;what-is-possible-in-a-cross-origin-isolated-environment%3F&quot; tabindex=&quot;-1&quot;&gt;What is possible in a cross-origin isolated environment? &lt;a class=&quot;header-anchor&quot; href=&quot;#what-is-possible-in-a-cross-origin-isolated-environment%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Enabling cross-origin isolation allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/Planned_changes&quot;&gt;&lt;code&gt;SharedArrayBuffer&lt;/code&gt; now works (Wasm Threads can be used)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/monitor-total-page-memory-usage/&quot;&gt;&lt;code&gt;performance.measureUserAgentSpecificMemory()&lt;/code&gt; now works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/cross-origin-isolated-hr-timers/&quot;&gt;&lt;code&gt;performance.now()&lt;/code&gt; and &lt;code&gt;performance.timeOrigin&lt;/code&gt; now work more accurately&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a while, Chrome introduced Site Isolation to enable the use of &lt;code&gt;SharedArrayBuffer&lt;/code&gt; and high-resolution timers, but &lt;a href=&quot;https://developer.chrome.com/blog/enabling-shared-array-buffer/&quot;&gt;starting with Chrome 92, this requirement was removed (changing the conditions to be the same as other browsers) and the condition was changed to require cross-origin isolated mode&lt;/a&gt; (we&#39;re sorry for the inconvenience this caused](&lt;a href=&quot;https://developers.google.com/search/blog/2021/03/sharedarraybuffer-notes?hl=ja&quot;&gt;https://developers.google.com/search/blog/2021/03/sharedarraybuffer-notes?hl=ja&lt;/a&gt;)).&lt;/p&gt;
&lt;h2 id=&quot;enabling-cross-origin-isolation-using-standardized-techniques&quot; tabindex=&quot;-1&quot;&gt;Enabling cross-origin isolation using standardized techniques &lt;a class=&quot;header-anchor&quot; href=&quot;#enabling-cross-origin-isolation-using-standardized-techniques&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are currently two conditions for enabling cross-origin isolation, a secure environment where web pages are completely isolated from other origins:&lt;/p&gt;
&lt;h3 id=&quot;condition-1.-the-html-document-sends-the-cross-origin-opener-policy%3A-same-origin-header&quot; tabindex=&quot;-1&quot;&gt;Condition 1. The HTML document sends the &lt;code&gt;Cross-Origin-Opener-Policy: same-origin&lt;/code&gt; header &lt;a class=&quot;header-anchor&quot; href=&quot;#condition-1.-the-html-document-sends-the-cross-origin-opener-policy%3A-same-origin-header&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When a browser opens a new window with &lt;code&gt;window.open()&lt;/code&gt;, it maintains communication using &lt;code&gt;postMessage()&lt;/code&gt; etc., so it uses the same process even cross-origin. In our previous article, we discussed how using COOP headers to separate processes and prevent Spectre We have introduced a method to avoid this threat. If you set &lt;code&gt;COOP: same-origin&lt;/code&gt;, the opened window will be opened in a separate process unless it is of the same origin, ensuring safety.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Opener-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, it should be noted that this means that communication using &lt;code&gt;postMessage()&lt;/code&gt; will no longer be possible.&lt;/p&gt;
&lt;p&gt;This is condition 1 for enabling cross-origin isolation.&lt;/p&gt;
&lt;p&gt;Condition 2. The HTML document sends the &lt;code&gt;Cross-Origin-Embedder-Policy: require-corp&lt;/code&gt; header&lt;/p&gt;
&lt;p&gt;The header &lt;code&gt;Cross-Origin-Embedder-Policy&lt;/code&gt; (COEP), which was not mentioned in the previous article, is not intended for security purposes in itself. &lt;strong&gt;COEP eliminates all embedded resources that are not permitted, thereby eliminating exposed resources and achieving cross-origin isolation.&lt;/strong&gt; Specifying &lt;code&gt;COEP: require-corp&lt;/code&gt; will block all resources that are not explicitly permitted by CORS or CORP from being loaded on this page.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Embedder-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;require-corp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is condition 2 for enabling cross-origin isolation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/2021/require-corp.png&quot; alt=&quot;COEP: require-corp&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;check-for-cross-origin-isolated&quot; tabindex=&quot;-1&quot;&gt;Check for cross-origin isolated &lt;a class=&quot;header-anchor&quot; href=&quot;#check-for-cross-origin-isolated&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can check whether a web page that sends the above two headers is cross-origin isolated by checking &lt;code&gt;self.crossOriginIsolated&lt;/code&gt;. If it returns &lt;code&gt;true&lt;/code&gt;, it is cross-origin isolated, and if it returns &lt;code&gt;false&lt;/code&gt;, it is not.&lt;/p&gt;
&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;crossOriginIsolated&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// The environment is cross-origin isolated.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token comment&quot;&gt;// The environment is NOT cross-origin isolated.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can try out cross-origin isolation in this demo.&lt;/p&gt;
&lt;h2 id=&quot;resources-are-blocked!%3F&quot; tabindex=&quot;-1&quot;&gt;Resources are blocked!? &lt;a class=&quot;header-anchor&quot; href=&quot;#resources-are-blocked!%3F&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It would be very easy if it ended here, but the difficult part begins from here. If you have actually tried cross-origin isolation, you will notice that this alone completely breaks normal websites. This is because all cross-origin resources that do not have special treatment are blocked. To load cross-origin or same-site cross-origin resources, you need to explicitly configure CORS or CORP to indicate that it is okay for them to be loaded from cross-origin.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://zenn.dev/agektmr/articles/f8dcd345a88c97&quot;&gt;Understanding same-site/cross-site, same-origin/cross-origin&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;h3 id=&quot;add-cors-or-cross-origin-resource-policy-headers-to-resources&quot; tabindex=&quot;-1&quot;&gt;Add CORS or &lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt; headers to resources &lt;a class=&quot;header-anchor&quot; href=&quot;#add-cors-or-cross-origin-resource-policy-headers-to-resources&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&amp;quot;Resources&amp;quot; here refers to anything that can be loaded from an HTML document, such as documents, images, videos, fonts, scripts, styles, etc.&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;As mentioned in our previous post, CORP indicates that resources can only be loaded from the same origin (&lt;code&gt;same-origin&lt;/code&gt;), same-site (&lt;code&gt;same-site&lt;/code&gt;), or any origin (&lt;code&gt;cross-origin&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For example, if &lt;code&gt;https://www.example.com&lt;/code&gt; sends &lt;code&gt;COEP: require-corp&lt;/code&gt;, the condition for loading an image is CORS-enabled, or:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it is served from the same origin, it will be loaded unconditionally (&lt;code&gt;CORP: same-origin&lt;/code&gt; may be specified).&lt;/li&gt;
&lt;li&gt;If it is served from the same site (e.g. &lt;code&gt;https://images.example.com/image.png&lt;/code&gt;), it will be loaded if it has &lt;code&gt;CORP: same-site&lt;/code&gt; or &lt;code&gt;CORP: cross-origin&lt;/code&gt;. Otherwise it will be blocked.&lt;/li&gt;
&lt;li&gt;If it is served from a completely different site, it will be loaded if it has &lt;code&gt;CORP: cross-origin&lt;/code&gt;. Otherwise it will be blocked.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Resource-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;cross-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you want to use CORS, you need to require it when loading a resource, for example by adding the &lt;code&gt;crossorigin&lt;/code&gt; attribute to the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag to send a CORS request.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;***/image.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;crossorigin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTML/Attributes/crossorigin&quot;&gt;&lt;code&gt;crossorigin&lt;/code&gt; attribute can be added to &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tags&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can try out the combined functionality of COEP and CORS/CORP in this demo.&lt;/p&gt;
&lt;h3 id=&quot;add-coep-to-the-html-document-loaded-in-the-iframe&quot; tabindex=&quot;-1&quot;&gt;Add COEP to the HTML document loaded in the iframe &lt;a class=&quot;header-anchor&quot; href=&quot;#add-coep-to-the-html-document-loaded-in-the-iframe&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As I mentioned in my previous article, HTML documents loaded in an iframe are also vulnerable to the Spectre threat if they are cross-origin. But what happens if that cross-origin HTML document also loads other cross-origin resources or documents?&lt;/p&gt;
&lt;p&gt;In fact, if you don&#39;t meet the requirements recursively, everything will be blocked. Embedding an iframe requires that it itself has &lt;code&gt;COEP: require-corp&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;In summary, if you embed a cross-origin HTML document in an iframe on a cross-origin isolated page, the HTML document loaded in that iframe must also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Must be &lt;code&gt;COEP: require-corp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Must be &lt;code&gt;CORP: cross-origin&lt;/code&gt; (&lt;code&gt;CORP: same-site&lt;/code&gt; is also acceptable for same-site/cross-origin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It will be.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In this case, &lt;code&gt;self.crossOriginIsolated&lt;/code&gt; within the iframe will become &lt;code&gt;false&lt;/code&gt;, but by specifying &lt;code&gt;allow=&amp;quot;cross-origin-isolated&amp;quot;&lt;/code&gt; in the iframe tag, it will become &lt;code&gt;true&lt;/code&gt;, allowing you to use &lt;code&gt;SharedArrayBuffer&lt;/code&gt; etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There may be cases where you want to enable cross-origin isolation only within an iframe, but unfortunately there is no way to do this. All frames on the same page must be part of the cross-origin isolation of the parent frame.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;


&lt;p&gt;You can also try out the iframe demo here:&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;The above is already supported by all major browsers: Chrome, Edge, Firefox, and Safari.&lt;/p&gt;
  &lt;/div&gt;
&lt;h2 id=&quot;challenges-of-cross-origin-isolation-and-solutions&quot; tabindex=&quot;-1&quot;&gt;Challenges of cross-origin isolation and solutions &lt;a class=&quot;header-anchor&quot; href=&quot;#challenges-of-cross-origin-isolation-and-solutions&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you follow the above steps completely, you will have &lt;code&gt;SharedArrayBuffer&lt;/code&gt; etc available in your browser.&lt;/p&gt;
&lt;p&gt;However, there are still challenges remaining.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;**Issue 1. &lt;code&gt;COOP: same-origin&lt;/code&gt; breaks integrations that use popup windows, such as OAuth and payments. **
Due to the nature of &lt;code&gt;COOP: same-origin&lt;/code&gt;, integrations that often involve opening cross-origin windows for communication, such as OAuth and payments, become impossible.&lt;/li&gt;
&lt;li&gt;**Issue 2. Even if you try to specify CORS or &lt;code&gt;CORP: cross-origin&lt;/code&gt;, you can&#39;t do so because they are resources from other companies. **
This is also a typical problem with cross-origin isolation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, while many resources delivered by Google already support &lt;code&gt;CORP: cross-origin&lt;/code&gt;, some services do not support cross-origin isolation due to the challenges mentioned above. For example, Google Ads delivers ads using iframes, but in some cases the content of the iframes is delivered by the advertiser. Since it is not realistic to require all of them to implement CORS or CORP, they have &lt;a href=&quot;https://developers.google.com/publisher-tag/guides/cross-origin-embedder-policy&quot;&gt;indicated their intention not to support it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In light of these developments, discussions are underway to re-enable &lt;code&gt;SharedArrayBuffer&lt;/code&gt; in Chrome without cross-origin isolation, and to relax the conditions for enabling cross-origin isolation from the standard specification side.&lt;/p&gt;
&lt;h3 id=&quot;enabling-sharedarraybuffer-without-cross-origin-isolation-in-chrome&quot; tabindex=&quot;-1&quot;&gt;Enabling &lt;code&gt;SharedArrayBuffer&lt;/code&gt; without cross-origin isolation in Chrome &lt;a class=&quot;header-anchor&quot; href=&quot;#enabling-sharedarraybuffer-without-cross-origin-isolation-in-chrome&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I explained that Chrome originally supported an architecture called Site Isolation, and that the transition to cross-origin isolation was made to align with other browsers. However, due to the issues mentioned above, there is also an option to continue using &lt;code&gt;SharedArrayBuffer&lt;/code&gt; without supporting cross-origin isolation. By applying a mechanism called &lt;a href=&quot;https://developer.chrome.com/ja/blog/origin-trials/#deprecation-trials&quot;&gt;Deprecation Trial&lt;/a&gt;, you can continue to use &lt;code&gt;SharedArrayBuffer&lt;/code&gt; as before, at least until the improvements described below are ready.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://developer.chrome.com/blog/enabling-shared-array-buffer/&quot;&gt;SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As of November 2021, the deprecation trial can be used to avoid the issue up to Chrome 103, but if the following improvements are not implemented in time, it may be extended. If you signed up for the Origin Trial, you will be notified by email whether the trial will be extended, but we will update the blog post above (even if this blog post is not updated).&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;To sign up for a deprecation trial, &lt;a href=&quot;https://developer.chrome.com/origintrials/#/view_trial/303992974847508481&quot;&gt;apply here and specify your origin&lt;/a&gt; and distribute the issued token in the &lt;code&gt;Origin-Trial&lt;/code&gt; header or &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag on your site. For more information, see &lt;a href=&quot;https://developer.chrome.com/ja/blog/origin-trials/&quot;&gt;Introduction to Chrome Origin Trials&lt;/a&gt;, which has just been translated into Japanese.&lt;/p&gt;
&lt;h3 id=&quot;relaxing-cross-origin-isolation-requirements&quot; tabindex=&quot;-1&quot;&gt;Relaxing cross-origin isolation requirements &lt;a class=&quot;header-anchor&quot; href=&quot;#relaxing-cross-origin-isolation-requirements&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Efforts are also underway to make cross-origin isolation more flexible from a standardization perspective. We will introduce the proposed specifications for this purpose.&lt;/p&gt;
&lt;h4 id=&quot;coep%3A-credentialless&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;COEP: credentialless&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;#coep%3A-credentialless&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The challenge is that it is difficult to require resources provided by other services to comply with CORS or CORP, but is that even necessary? Many resources are images, styles, fonts, and other resources that are publicly available on the Internet. Anyone can download them if they know the URL, so authentication should be required to protect them.&lt;/p&gt;
&lt;p&gt;So, instead of requiring CORS or CORP as a COEP mode, it would be better to create a mode that assumes requests are made without authentication, and that&#39;s how &lt;code&gt;COEP: credentialless&lt;/code&gt; was devised.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Embedder-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;credentialless&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;COEP: credentialless&lt;/code&gt; omits authentication methods such as cookies, client certificates, and Authorization headers from requests to the server, allowing you to enable cross-origin isolation without exposing third-party resources to risk.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Even in the case of &lt;code&gt;COEP: credentialless&lt;/code&gt;, you can explicitly send authentication information by adding the &lt;code&gt;crossorigin&lt;/code&gt; attribute to the request.&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://developer.chrome.com/blog/coep-credentialless-origin-trial/&quot;&gt;Load cross-origin resources without CORP headers using &lt;code&gt;COEP: credentialless&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;Only available in Chrome from version 96.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/2021/credentialless.png&quot; alt=&quot;COEP: credentialless&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;anonymous-iframe&quot; tabindex=&quot;-1&quot;&gt;anonymous iframe &lt;a class=&quot;header-anchor&quot; href=&quot;#anonymous-iframe&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Following a similar approach, we are considering an anonymous iframe method that does not send authentication information to iframes, thereby not putting third-party resources at risk. However, due to the complexity of iframe architecture, the specifications are currently under development.&lt;/p&gt;
&lt;h4 id=&quot;coop%3A-same-origin-allow-popups-plus-coep&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;COOP: same-origin-allow-popups-plus-coep&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;#coop%3A-same-origin-allow-popups-plus-coep&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;A mitigation is also being considered for the issue where using &lt;code&gt;COOP: same-origin&lt;/code&gt; breaks popup window integrations such as OAuth and payments. The idea is that using &lt;code&gt;COOP: same-origin-allow-popups&lt;/code&gt; allows communication with windows opened from your own origin, so it might be a good idea to make this a condition for cross-origin isolation.&lt;/p&gt;
&lt;p&gt;A dedicated mode for this purpose, &lt;a href=&quot;https://github.com/camillelamy/explainers/blob/master/coi-with-popups.md&quot;&gt;&lt;code&gt;COOP: same-origin-allow-popups-plus-coep&lt;/code&gt;&lt;/a&gt;, is being considered, but is still in the early stages of development.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;summary &lt;a class=&quot;header-anchor&quot; href=&quot;#summary&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This article has explained how to enable cross-origin isolation in browsers and use &lt;code&gt;SharedArrayBuffer&lt;/code&gt; and high-resolution timers, but it&#39;s quite complicated and requires a lot of thought.&lt;/p&gt;
&lt;p&gt;If you want it to work on Firefox or Safari right away, you could consider giving up on cross-origin resource integration to some extent and enabling cross-origin isolation. However, if you just want it to work on Chrome as usual for the time being, the best option for now is to sign up for a &lt;a href=&quot;https://developer.chrome.com/origintrials/#/view_trial/303992974847508481&quot;&gt;deprecation trial&lt;/a&gt; and see how it goes for a while.&lt;/p&gt;
&lt;p&gt;The content explained in this article was released as a session video at the Chrome Dev Summit in 2020.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/XLNJYhjA-0c&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;p&gt;Finally, on November 17th, as part of the Chrome Dev Summit, we will be hosting a one-hour workshop that will explain the journey from Spectre to Site Isolation and cross-origin isolation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/devsummit/events/week-2/workshops/gain-security-powerful-features-cross-origin-isolation/&quot;&gt;Gain security and powerful features with cross-origin isolation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have any questions, please feel free to join us (sessions will mainly be in English).&lt;/p&gt;
&lt;h3 id=&quot;reference-articles&quot; tabindex=&quot;-1&quot;&gt;Reference articles &lt;a class=&quot;header-anchor&quot; href=&quot;#reference-articles&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/coop-coep/&quot;&gt;Making your website &amp;quot;cross-origin isolated&amp;quot; using COOP and COEP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/why-coop-coep/&quot;&gt;Why you need &amp;quot;cross-origin isolated&amp;quot; for powerful features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/i18n/ja/cross-origin-isolation-guide/&quot;&gt;Guide to enabling cross-origin isolation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/enabling-shared-array-buffer/&quot;&gt;SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/blog/2021/03/sharedarraybuffer-notes?hl=ja&quot;&gt;Explanation of the message regarding SharedArrayBuffer objects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://techblog.zozo.com/entry/zozotown-shared-array-buffer&quot;&gt;ZOZOTOWN&#39;s research and solution for the SharedArrayBuffer warning in Chrome 92 and later&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
</entry>




<entry>
  <title type="html"><![CDATA[The Spectre threat and the headers websites should set]]></title>
  <link rel="alternate" type="text/html" href="/en/2021/11/browser-security.html" />
  <id></id>
  <published>2021-11-01T00:00:00Z</published>
  <updated>2021-11-01T00:00:00Z</updated>
  <author>
    <name></name>
    <email></email>
  </author>
	<id>/en/2021/11/browser-security.html</id>
  <content type="html">&lt;p&gt;This is a long article, so I&#39;ll start with the conclusion.&lt;/p&gt;
&lt;p&gt;The emergence of Spectre has increased the security requirements for websites. Specific measures required are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All resources should use the &lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt; header to control loading into cross-origin documents.&lt;/li&gt;
&lt;li&gt;HTML documents should include the &lt;code&gt;X-Frame-Options&lt;/code&gt; header or the &lt;code&gt;Content-Security-Policy&lt;/code&gt; (CSP) header with the &lt;code&gt;frame-ancestors&lt;/code&gt; directive to control embedding in an iframe in a cross-origin page.&lt;/li&gt;
&lt;li&gt;HTML documents should include the &lt;code&gt;Cross-Origin-Opener-Policy&lt;/code&gt; header to control communication with cross-origin pages when opened as a popup window.&lt;/li&gt;
&lt;li&gt;All resources should include appropriate &lt;code&gt;Content-Type&lt;/code&gt; and &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; headers to prevent malicious cross-origin loading.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- excerpt --&gt;
&lt;p&gt;To understand why such a header is necessary and to understand the details, we first need to look at how modern browsers display web pages.&lt;/p&gt;
&lt;h2 id=&quot;a-look-back-at-how-browsers-work&quot; tabindex=&quot;-1&quot;&gt;A look back at how browsers work &lt;a class=&quot;header-anchor&quot; href=&quot;#a-look-back-at-how-browsers-work&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each tab in a browser has a URL that tells the user which page they are currently viewing. The URL displayed in a tab usually points to an HTML document, which represents the entire web page by loading various resources such as images, videos, stylesheets, scripts, and fonts. In this case, the domain of each resource does not necessarily match the domain of the currently viewed page.&lt;/p&gt;
&lt;p&gt;In this case, the domain displayed in the URL bar is called the &amp;quot;first party,&amp;quot; and any domain other than the first party of the loaded resource is called the &amp;quot;third party.&amp;quot; (So, a &amp;quot;third-party cookie&amp;quot; is a cookie associated with a third-party resource.)&lt;/p&gt;
&lt;p&gt;Regarding the relationship between two domains, if only the eTLD+1 (effective Top Level Domain and the one above = e.g. &lt;code&gt;example.com&lt;/code&gt;) is the same, it is called same-site; if the scheme, hostname, and port number all match (e.g. &lt;code&gt;https://www.example.com:8080&lt;/code&gt;), it is called same-origin; otherwise it is called cross-site or cross-origin.&lt;/p&gt;
&lt;p&gt;In the rest of this article, we will explicitly use same-site/cross-site and same-origin/cross-origin, so if you are unsure about the difference between them, please start here.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://zenn.dev/agektmr/articles/f8dcd345a88c97&quot;&gt;Understanding same-site/cross-site, same-origin/cross-origin&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;The Web&#39;s greatest appeal is its composability, which allows you to combine various resources from different domains (services) like a puzzle to create rich expressions. Especially since Web 2.0, the concept of APIs has been added to this and further developed. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement analytics simply by loading a script and analyze or track the behavior of users who visit your site.&lt;/li&gt;
&lt;li&gt;Use iframes to embed information from external sites as widgets, and embed ads, social media buttons, personalizable maps, and videos.&lt;/li&gt;
&lt;li&gt;Communicate with external sites via popup windows to enable integration such as login and payment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cross-origin collaboration is what makes the web the web.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/2021/spectre1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;same-origin-policy&quot; tabindex=&quot;-1&quot;&gt;Same-Origin Policy &lt;a class=&quot;header-anchor&quot; href=&quot;#same-origin-policy&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;By the way, one of the scary things about the online world is that information that you thought you had entrusted to the right place could end up in a place or be used by someone you didn&#39;t intend. This is especially serious if that information is credit card numbers or bank account information. In a web browser, the &amp;quot;right place&amp;quot; is represented in the form of a domain, and its reliability is guaranteed by using HTTPS.&lt;/p&gt;
&lt;p&gt;Attackers can steal information from three main points: browsers, networks, and servers. Browser attacks can also be said to involve crossing domain barriers. The &lt;strong&gt;Same-Origin Policy&lt;/strong&gt; allows different domains to communicate with each other on a browser while still maintaining a certain level of security for each site. This policy is based on a delicate balance between maintaining mutual inviolability at the origin boundary, while allowing some degree of communication.&lt;/p&gt;
&lt;p&gt;Let&#39;s take an embedded video as an example. This cross-origin video is embedded in an iframe, allowing for personalization using third-party cookies. If the user is logged in to the hosting domain, they can access the account and perform actions like &amp;quot;watch later,&amp;quot; which is convenient. However, unless a specific API is provided, the embedding site cannot access this account information. This is because navigating the DOM tree of the &lt;code&gt;window&lt;/code&gt; object obtained from the iframe only provides limited information. It is impossible to see what HTML is being displayed, let alone the contents of cookies.&lt;/p&gt;
&lt;p&gt;The same applies to windows opened as popup windows. For example, if a typical payment service is linked to a window opened using &lt;code&gt;window.open()&lt;/code&gt; and the DOM tree is accessible, the store could eavesdrop on the user&#39;s credit card information. For this reason, browsers limit the information that can be accessed from the return value of &lt;code&gt;window.open()&lt;/code&gt; and from &lt;code&gt;window.opener&lt;/code&gt; of the opened window.&lt;/p&gt;
&lt;p&gt;In this way, the browser&#39;s Same-Origin Policy prevents cross-origin scripts from accessing arbitrary information.&lt;/p&gt;
&lt;h3 id=&quot;cross-origin-resource-sharing-(cors)&quot; tabindex=&quot;-1&quot;&gt;Cross-Origin Resource Sharing (CORS) &lt;a class=&quot;header-anchor&quot; href=&quot;#cross-origin-resource-sharing-(cors)&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;By the way, when you research &lt;a href=&quot;https://web.dev/cross-origin-resource-sharing/&quot;&gt;Cross-Origin Resource Sharing&lt;/a&gt; (CORS), most articles describe it as &amp;quot;a mechanism for requesting resources hosted on cross-origin sites using &lt;code&gt;fetch()&lt;/code&gt;.&amp;quot; While that&#39;s true, not all of them are. In fact, CORS also plays a role in access control on the browser.&lt;/p&gt;
&lt;p&gt;For example, when loading a cross-origin image into your page, you can simply use the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag and not worry about CORS. There&#39;s no problem if the image is displayed on the page at the specified size and the user can view it. However, in this case, the browser uses the Same-Origin Policy to protect the image&#39;s contents (binary) from being viewed by cross-origin scripts. This is called an &lt;strong&gt;Opaque Response&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, if you try to get the binary of an image loaded from a cross-origin browser, and then try to retrieve it as &lt;code&gt;canvas&lt;/code&gt;, &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/drawImage&quot;&gt;&lt;code&gt;drawImage()&lt;/code&gt;&lt;/a&gt; and then &lt;a href=&quot;https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/getImageData&quot;&gt;&lt;code&gt;getImageData()&lt;/code&gt;&lt;/a&gt;, Chrome will display the error &lt;code&gt;DOMException: Failed to execute &#39;getImageData&#39; on &#39;CanvasRenderingContext2D&#39;: The canvas has been tainted by cross-origin data.&lt;/code&gt; and fail. This is because the browser is protected by the Same-Origin Policy.&lt;/p&gt;
&lt;p&gt;To enable this, you must explicitly allow it by specifying the &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; attribute with the &lt;code&gt;crossorigin&lt;/code&gt; attribute and by supporting CORS on the server side.&lt;/p&gt;
&lt;p&gt;I&#39;ve created a simple demo, so give it a try.&lt;/p&gt;
&lt;p&gt;In this way, the Same-Origin Policy ensures the security of the web to some extent by allowing browsers to control access between origins.&lt;/p&gt;
&lt;p&gt;What is the Spectre threat?&lt;/p&gt;
&lt;p&gt;Spectre is a vulnerability in the architecture of CPUs that was announced in 2018. Simply put, it allows values in memory space controlled by the same process to be inferred. Spectre makes it possible for cross-origin scripts to spy on resources that transcend the Same-Origin Policy, which poses a major threat given the nature of the web.&lt;/p&gt;
&lt;p&gt;Once malicious JavaScript was loaded, an attacker could bypass the Same-Origin Policy and read any DOM element running in the same process. With the architecture of most browsers at the time, simply loading resources via an attacker&#39;s page could result in information theft. If the resources included authentication information or other information requiring authentication, even that information could be compromised.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/2021/spectre2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;measures-taken-by-each-browser&quot; tabindex=&quot;-1&quot;&gt;Measures taken by each browser &lt;a class=&quot;header-anchor&quot; href=&quot;#measures-taken-by-each-browser&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Spectre&#39;s ability to efficiently steal information by leveraging high-resolution timers has led browser vendors to disable functions related to high-resolution timers. A prime example of a function that became unavailable as a result of this was &lt;code&gt;SharedArrayBuffer&lt;/code&gt;. Other measures taken included reducing the accuracy of &lt;code&gt;performance.now()&lt;/code&gt;. However, these measures only reduced efficiency, and Google research has shown that completely eliminating the threat of Spectre would require fundamental changes to the browser&#39;s architecture.&lt;/p&gt;
&lt;h3 id=&quot;site-isolation&quot; tabindex=&quot;-1&quot;&gt;Site Isolation &lt;a class=&quot;header-anchor&quot; href=&quot;#site-isolation&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;That&#39;s where Site Isolation comes in. &lt;a href=&quot;https://developers.google.com/web/updates/2018/07/site-isolation&quot;&gt;Site Isolation&lt;/a&gt; was a project the Chrome team had been working on since before Spectre became known, to mitigate the risk of exploiting memory bugs to bypass the Same-Origin Policy. The discovery of Spectre accelerated the completion of this architecture, and it was released experimentally in May 2018.&lt;/p&gt;
&lt;p&gt;Chrome originally created processes roughly on a tab-by-tab basis, but Site Isolation, as the name suggests, separates processes on a site-by-site basis to isolate cross-site resources and protect against Spectre threats. Specifically, it uses techniques such as &lt;a href=&quot;https://www.chromium.org/Home/chromium-security/corb-for-developers&quot;&gt;Cross-Origin Read Blocking (CORB)&lt;/a&gt; and &lt;a href=&quot;https://www.chromium.org/developers/design-documents/oop-iframes&quot;&gt;Out-of-process iframe (OOPIF)&lt;/a&gt;. For more information, see the &lt;a href=&quot;https://www.chromium.org/developers/design-documents/site-isolation&quot;&gt;Site Isolation page&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Actually, it would be more correct to say &amp;quot;separate the Browsing Context Group&amp;quot; rather than &amp;quot;separate the process,&amp;quot; but for convenience we use the word &amp;quot;process&amp;quot; here.&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;Dividing processes into smaller ones incurs overhead, increasing memory consumption by about 10%, making it unsuitable for resource-scarce mobile devices. For this reason, Site Isolation is generally only enabled in desktop environments and for some mobile sites. This is why &lt;code&gt;SharedArrayBuffer&lt;/code&gt; was available only in the desktop version of Chrome for a while.&lt;/p&gt;
&lt;p&gt;The problem is that Site Isolation is a Chrome-specific architecture. Firefox is currently working on a project called Fission to introduce a Site Isolation architecture, but the web is built on standard technologies, so security cannot be guaranteed by assuming a specific architecture.&lt;/p&gt;
&lt;p&gt;This is where the main topic comes in: HTTP response headers that require the browser to handle cross-origin resources appropriately, regardless of the browser architecture, such as by routing them to a separate process.&lt;/p&gt;
&lt;h2 id=&quot;preventing-spectre-attacks-before-they-happen&quot; tabindex=&quot;-1&quot;&gt;Preventing Spectre attacks before they happen &lt;a class=&quot;header-anchor&quot; href=&quot;#preventing-spectre-attacks-before-they-happen&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To prevent Spectre attacks, you need to stop resources from your origin before they are pulled into the same process as a malicious origin. By looking at the HTTP response headers, the browser&#39;s network process can block the resource before it is passed to the malicious origin&#39;s renderer process, or pass it to a different renderer process.&lt;/p&gt;
&lt;p&gt;If you open Chrome&#39;s Task Manager, you can see how processes are grouped by Process ID.&lt;/p&gt;
&lt;p&gt;The four HTTP response headers that should be added are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Frame-Options&lt;/code&gt; or CSP &lt;code&gt;frame-ancestors&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cross-Origin-Opener-Policy: same-origin-allow-popups&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Content-Type&lt;/code&gt; and &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;controlling-resource-embedding-with-cross-origin-resource-policy-(corp)&quot; tabindex=&quot;-1&quot;&gt;Controlling resource embedding with &lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt; (CORP) &lt;a class=&quot;header-anchor&quot; href=&quot;#controlling-resource-embedding-with-cross-origin-resource-policy-(corp)&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You can allow resources to be loaded from &lt;code&gt;same-origin&lt;/code&gt;, &lt;code&gt;same-site&lt;/code&gt;, or from anywhere with &lt;code&gt;cross-origin&lt;/code&gt;, such as images, videos, audio, scripts, and JSON via API. For example, adding the respective headers to an image hosted in &lt;code&gt;https://images.example.com&lt;/code&gt; will result in the following:&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Resource-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This image can only be loaded from an HTML document served from the same-origin &lt;code&gt;https://images.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Resource-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-site&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This image can be loaded from domains containing the same-site &lt;code&gt;example.com&lt;/code&gt;, e.g. &lt;code&gt;https://www.example.com&lt;/code&gt;, but not from other eTLD+1s, e.g. &lt;code&gt;https://site.example&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Resource-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;cross-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;&lt;strong&gt;Added 2021/11/04:&lt;/strong&gt; It was originally written as &lt;code&gt;cross-site&lt;/code&gt;, but it was a mistake and should have been &lt;code&gt;cross-origin&lt;/code&gt;.&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;Images with the default &lt;code&gt;cross-origin&lt;/code&gt; can be loaded from any origin, not just &lt;code&gt;https://images.example.com&lt;/code&gt; or &lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can try these headers out in this demo. Open DevTools and see the impact of the &lt;code&gt;Cross-Origin-Resource-Policy&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://caniuse.com/mdn-http_headers_cross-origin-resource-policy&quot;&gt;CORP&lt;/a&gt; is already supported in Chrome, Firefox, and Safari.&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Please note that CORP does not prevent a resource from being served. It is not like an ACL (Access Control List) on the server, and does not determine whether a resource will be served in response to a request from a browser that does not support CORP, or from another server, or from an HTTP client that is not a browser.&lt;/p&gt;
&lt;p&gt;CORS is similar to CORP, but differs in that it allows for more granular determination of conditions and can choose not to serve requests depending on the origin (&lt;a href=&quot;https://developer.mozilla.org/docs/Glossary/Preflight_request&quot;&gt;Preflight Request&lt;/a&gt;).&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;Note that it&#39;s not a problem if publicly available resources are stolen. What&#39;s problematic is information served when authenticated, which often requires a third-party cookie. If you set the appropriate &lt;code&gt;SameSite&lt;/code&gt; attribute, even if you fall victim to Spectre, no authenticated requests will be sent.&lt;/p&gt;
&lt;p&gt;Fortunately, the default &lt;code&gt;SameSite&lt;/code&gt; attribute for cookies in Chrome and Edge is &lt;code&gt;Lax&lt;/code&gt;. If you are a service provider who has inadvertently set &lt;code&gt;SameSite&lt;/code&gt; to &lt;code&gt;None&lt;/code&gt;, we recommend that you review your settings in conjunction with the introduction of the CORP header.&lt;/p&gt;
&lt;h3 id=&quot;control-document-iframe-embedding-with-x-frame-options-or-csp-frame-ancestors&quot; tabindex=&quot;-1&quot;&gt;Control document iframe embedding with &lt;code&gt;X-Frame-Options&lt;/code&gt; or CSP &lt;code&gt;frame-ancestors&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;#control-document-iframe-embedding-with-x-frame-options-or-csp-frame-ancestors&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As of October 2021, all browsers allow embedding HTML documents in iframes by default, and resource providers must take appropriate action to prevent this.&lt;/p&gt;
&lt;p&gt;To prevent cross-origin sites from loading in an iframe, you can either block them entirely using the &lt;code&gt;X-Frame-Options&lt;/code&gt; header, or explicitly specify which origins are allowed to be embedded using the &lt;code&gt;frame-ancestors&lt;/code&gt; CSP (Content Security Policy) header directive.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;X-Frame-Options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;DENY&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML documents with &lt;code&gt;DENY&lt;/code&gt; will not be loaded in an iframe regardless of the parent page&#39;s origin. You can also set this to &lt;code&gt;SAMEORIGIN&lt;/code&gt; to load in an iframe only if the parent page is the same-origin.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Content-Security-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value csp languages-csp&quot;&gt;frame-ancestors &#39;self&#39; https://www.example.com;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An HTML document with the above CSP specified will not be loaded in an iframe unless the parent page has the same origin as the original or is &lt;code&gt;https://www.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is recommended that all documents that are not intended to be loaded in an iframe use &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Both &lt;a href=&quot;https://caniuse.com/x-frame-options&quot;&gt;&lt;code&gt;X-Frame-Options&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://caniuse.com/mdn-http_headers_csp_content-security-policy_frame-ancestors&quot;&gt;CSP &lt;code&gt;frame-ancestors&lt;/code&gt;&lt;/a&gt; are already supported by Chrome, Firefox, and Safari.&lt;/p&gt;
&lt;h3 id=&quot;controlling-communication-between-windows-with-cross-origin-opener-policy-(coop)&quot; tabindex=&quot;-1&quot;&gt;Controlling communication between windows with &lt;code&gt;Cross-Origin-Opener-Policy&lt;/code&gt; (COOP) &lt;a class=&quot;header-anchor&quot; href=&quot;#controlling-communication-between-windows-with-cross-origin-opener-policy-(coop)&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Windows opened using &lt;code&gt;window.open()&lt;/code&gt; can communicate with each other using &lt;code&gt;postMessage()&lt;/code&gt;. In this case, even if the browser is cross-origin, it is deployed in the same process, making it vulnerable to Spectre attacks.&lt;/p&gt;
&lt;p&gt;By using the &lt;code&gt;Cross-Origin-Opener-Policy&lt;/code&gt; (COOP) header, you can ensure safety by separating processes when opening cross-origin windows. However, please note that in this case, communication using &lt;code&gt;postMessage()&lt;/code&gt; will no longer be possible.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Opener-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-origin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you specify &lt;code&gt;same-origin&lt;/code&gt;, even if you open a cross-origin popup window yourself or if a document from your origin is opened from a cross-origin window, they will be in separate processes and communication will be impossible.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Opener-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;same-origin-allow-popups&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;same-origin-allow-popups&lt;/code&gt; separates processes when opened from a cross-origin window, but not when you open the cross-origin window yourself (however, the cross-origin window must not specify COOP or must specify &lt;code&gt;unsafe-none&lt;/code&gt;).&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Cross-Origin-Opener-Policy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;unsafe-none&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;unsafe-none&lt;/code&gt; is the default, and can be used to specify that a separate process is not required when opening a cross-origin window or when opening a cross-origin window (provided that the cross-origin window does not specify COOP or specifies &lt;code&gt;unsafe-none&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;You can try out these headers in this demo:&lt;/p&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;Similar to &lt;code&gt;Cross-Origin-Opener-Policy: same-origin&lt;/code&gt; is &lt;code&gt;a[rel=&amp;quot;noopener&amp;quot;]&lt;/code&gt;. This also serves to avoid the risk of Spectre, which occurs because new windows opened with the &lt;code&gt;&amp;lt;a target=&amp;quot;_blank&amp;quot;&amp;gt;&lt;/code&gt; tag are opened in the same process by default. Fortunately, &lt;code&gt;rel=&amp;quot;noopener&amp;quot;&lt;/code&gt; has now been changed to the default in &lt;a href=&quot;https://www.chromestatus.com/feature/6140064063029248&quot;&gt;Chrome&lt;/a&gt;, &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1503681&quot;&gt;Firefox&lt;/a&gt;, and &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=190481&quot;&gt;Safari&lt;/a&gt;, so you no longer need to worry about it. Conversely, to achieve the same result as &lt;code&gt;Cross-Origin-Opener-Policy: unsafe-none&lt;/code&gt;, specify &lt;code&gt;rel=&amp;quot;opener&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://blog.jxck.io/entries/2016-06-12/noopener.html&quot;&gt;Preventing Tabnabbing by Adding rel=noopener to Links | blog.jxck.io&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;p&gt;While COOP can protect your site from Spectre attacks from cross-origin windows, you still need to be careful with pages that use features that require cross-origin windows to be opened, such as OAuth or payment functions. We recommend adding &lt;code&gt;Cross-Origin-Opener-Policy: same-origin-allow-popups&lt;/code&gt; to all HTML documents. (For debugging instructions, see &lt;a href=&quot;https://web.dev/coop-coep/#debug-issues-using-chrome-devtools&quot;&gt;Making your website &amp;quot;cross-origin isolated&amp;quot; using COOP and COEP // Debug issues using Chrome DevTools&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://caniuse.com/mdn-http_headers_cross-origin-opener-policy&quot;&gt;COOP&lt;/a&gt; is already supported in Chrome and Firefox, and &lt;a href=&quot;https://webkit.org/blog/11962/release-notes-for-safari-technology-preview-131/&quot;&gt;it appears that support for Safari will be coming soon (as of October 2021)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;protect-resources-from-malicious-cross-origin-loading-with-x-content-type-options%3A-nosniff&quot; tabindex=&quot;-1&quot;&gt;Protect resources from malicious cross-origin loading with &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; &lt;a class=&quot;header-anchor&quot; href=&quot;#protect-resources-from-malicious-cross-origin-loading-with-x-content-type-options%3A-nosniff&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Some browsers may automatically change the MIME-Type from the resource content and load it into the page, even if &lt;code&gt;Content-Type&lt;/code&gt; is set, which is a known vulnerability. This can be used as a means to load resources into the same page process, making it applicable to Spectre attacks. Specifying &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt; will prevent the browser from doing this. Be sure to specify the appropriate &lt;code&gt;Content-Type&lt;/code&gt; header and &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;X-Content-Type-Options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;nosniff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;X-Content-Type-Options&lt;/code&gt; is available in all browsers, including IE.&lt;/p&gt;
&lt;h2 id=&quot;a-story-of-the-future&quot; tabindex=&quot;-1&quot;&gt;A story of the future &lt;a class=&quot;header-anchor&quot; href=&quot;#a-story-of-the-future&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I&#39;ve tried to simplify this complex topic as much as possible, but I don&#39;t think it&#39;s realistic for every web developer to understand and implement these headers. It would be great if browsers could do it automatically. But that would mean completely reversing the current default behavior, which is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disable embedding of cross-origin HTML documents by default = &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt; default.&lt;/li&gt;
&lt;li&gt;Disable communication with cross-origin popup windows by default = &lt;code&gt;Cross-Origin-Opener-Policy: same-origin-allow-popups&lt;/code&gt; default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Chrome team is working to make this a reality, but reversing the default is a disruptive change. We understand that this is an unavoidable step in making the web a safer place, and we hope that as many developers as possible will understand this and begin preparing little by little.&lt;/p&gt;
&lt;p&gt;Additionally, the content explained in this article will be made available as a session video at Google I/O 2021. It will also have Japanese subtitles, so please take a look.&lt;/p&gt;
&lt;div class=&quot;video-wrap&quot;&gt;
    &lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/J6BZ9IQELNA&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;div class=&quot;aside&quot;&gt;
&lt;p&gt;This article touched on some of the HTTP headers related to Spectre, but there are a few other important ones. Please refer to this page for a summary.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/security-headers/&quot;&gt;Security headers quick reference&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, &lt;a href=&quot;https://twitter.com/mikewest&quot;&gt;Mike West&lt;/a&gt;&#39;s Post-Spectre Web Development is a more practical take on the topics discussed in this article, broken down by use case.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/TR/post-spectre-webdev/&quot;&gt;Post-Specter Web Development&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;


&lt;p&gt;*The illustrations for this article were created by &lt;a href=&quot;https://twitter.com/kosamari&quot;&gt;@kosamari&lt;/a&gt;.&lt;/p&gt;
</content>
</entry>
































































































































































































































</feed>
