3.3.9 Level AAA Guideline 3.3 Input Assistance Added in WCAG 2.2 Not detectable automatically

Accessible Authentication (Enhanced)

A cognitive function test is not required for any authentication step, with the object-recognition and personal-content exceptions of 3.3.8 removed.

Who this affects

Users with cognitive disabilities, held to the strictest standard — even "select all the images with a bus" is disallowed.

The failure and the fix

Each example below is a self-contained page, loaded in a frame so its markup cannot affect this page. Open either one on its own to test it with a keyboard or screen reader.

Fails 3.3.9

Open the failing example in a new tab

fail.html — the problem

<h1>Sign in</h1>

<!-- This page satisfies 3.3.8 at AA:
       - autocomplete tokens are present, so a password manager can fill the form
       - paste is not blocked
       - the CAPTCHA is OBJECT RECOGNITION, which 3.3.8 explicitly permits

     3.3.9 at AAA removes the object-recognition exception, and the
     personal-content exception with it. "Select every image with a book" is
     still a cognitive function test: it requires the user to perceive images,
     categorise them, and hold the instruction in working memory. -->
<form>
  <div class="field">
    <label for="u">Email address</label>
    <input type="email" id="u" autocomplete="username">
  </div>
  <div class="field">
    <label for="p">Password</label>
    <input type="password" id="p" autocomplete="current-password">
  </div>

  <fieldset>
    <legend>Select every image that shows a book</legend>
    <div class="grid">
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 1: a book">📕</button>
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 2: a cup">☕</button>
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 3: a book">📗</button>
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 4: a tree">🌳</button>
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 5: a book">📘</button>
      <button type="button" class="cell" aria-pressed="false" aria-label="Image 6: a car">🚗</button>
    </div>
  </fieldset>

  <button type="submit" class="button">Sign in</button>
</form>

Meets 3.3.9

Open the passing example in a new tab

pass.html — the fix

<h1>Sign in</h1>

<!-- FIX 1: a passkey. The user proves who they are with their device -
     fingerprint, face, or a hardware key. Nothing is recalled, transcribed or
     solved, so there is no cognitive function test at any point. This is the
     cleanest way to satisfy 3.3.9, and it is also more secure than a password. -->
<div class="opt">
  <h2>Sign in with a passkey</h2>
  <p>Use your device's fingerprint, face recognition or security key. Nothing to
     remember and nothing to type.</p>
  <button type="button" class="button">Continue with a passkey</button>
</div>

<!-- FIX 2: a one-time sign-in link by email. The user clicks a link; they do
     not transcribe a code, which would itself be a cognitive function test
     unless it can be pasted. -->
<div class="opt">
  <h2>Sign in with an email link</h2>
  <p>We will email you a link that signs you in. No password, no code to copy.</p>
  <div class="field">
    <label for="e">Email address</label>
    <input type="email" id="e" autocomplete="username">
  </div>
  <button type="button" class="button button--secondary">Email me a sign-in link</button>
</div>

<!-- FIX 3: the password route remains for people who prefer it, with paste
     allowed and correct autocomplete tokens so a password manager does the
     remembering. Keeping this option is important: removing choice is its own
     accessibility problem. -->
<div class="opt">
  <h2>Sign in with a password</h2>
  <div class="field">
    <label for="u">Email address</label>
    <input type="email" id="u" autocomplete="username">
  </div>
  <div class="field">
    <label for="p">Password</label>
    <input type="password" id="p" autocomplete="current-password">
  </div>
  <button type="submit" class="button">Sign in</button>
</div>

<!-- No CAPTCHA of any kind. Where you need bot protection without a cognitive
     function test: server-side risk scoring, rate limiting, proof-of-work
     challenges the browser solves invisibly, or a hardware factor.

     How the two criteria differ:
       3.3.8 (AA)  no cognitive function test, EXCEPT object recognition or
                   identifying non-text content the user provided
       3.3.9 (AAA) no cognitive function test, no exceptions

     And remember what 3.3.8 already establishes: "remember your password" IS a
     cognitive function test. It is only permitted at AA because password
     managers exist - which is precisely why blocking paste breaks conformance. -->

How to test it

Confirm authentication relies on something other than recall or puzzle solving: a passkey, a hardware token, an email or SMS link, or biometrics.

  • Automated

    Requires assessing the authentication mechanisms offered.

    No axe rule maps to this criterion. It has to be checked by a person.

  • Keyboard

    Unplug the mouse. Move through the page with Tab, Shift+Tab, Enter, Space and the arrow keys. See the keyboard testing script.

  • Screen reader

    Listen to both examples with NVDA, JAWS, VoiceOver or TalkBack and compare what is announced. See the screen reader cheat sheets.

  • Visual

    Zoom to 200% and 400%, narrow the viewport to 320 px, and apply the text-spacing overrides. See the visual testing procedures.

In the specification