フォームのオートコンプリートを Web サイト側から無効にする方法を説明します。
デフォルト設定の場合、Web サイト上の <input>
フィールドを通じてユーザが送信した情報はブラウザによって記憶されます。 これよってブラウザは、オートコンプリート(入力を受けたフィールドの補完候補をユーザに提示する機能)や、オートフィル(読み込まれたフィールドをあらかじめブラウザが補完する機能)を実現しています。
これらの機能はユーザのプライバシーに関わるかもしれないため、ブラウザはユーザ自身がこの機能を無効にできるようにしています。しかしながら、フォームで送信される情報の中には再利用しないもの(ワンタイムコードなど)や、機微な情報(公的な識別番号やクレジットカード番号など)があります。ブラウザのオートコンプリート機能が有効であっても、Web サイトによってはフィールドの値をブラウザに記憶させないほうが適切かもしれません。
フォームにおけるオートコンプリートを無効にするには、autocomplete
属性に "off" を指定することで実現できます。
autocomplete="off"
上記の設定はフォーム全体に適用することも、特定の input 要素に指定することも可能です。
<form method="post" action="/form" autocomplete="off"> […] </form>
<form method="post" action="/form"> […] <div> <label for="cc">クレジットカード番号:</label> <input type="text" id="cc" name="cc" autocomplete="off"> </div> </form>
autocomplete="off"
を指定すると、以下の 2 つの効果が生じます。
- 同じようなフォームにおいて、今後ブラウザがオートコンプリートを行うためにデータを保存しないようにします。しかし、実際の動作はブラウザによって異なります。
- ブラウザがフォームデータをセッション履歴にキャッシュしないようにします。フォームデータがセッション履歴にキャッシュされた場合、フォームの送信後に「戻る」ボタンで元のページに戻った際にユーザの入力データが表示されます。
autocomplete
属性に off
が設定されている場合でも、ブラウザはオートコンプリートを行うことがあります。この予想外の挙動に開発者は戸惑うかもしれません。オートコンプリートを完全に無効にするには、その属性値に 任意の文字列を代入 するというトリックを用います。
autocomplete="nope"
任意に指定した文字列は 属性値として定義された値
に含まれていませんが、ブラウザのオートコンプリート機能は無効になります。
autocomplete 属性とログインフィールド
モダンなブラウザではパスワードを一括管理する機能が実装されています。ユーザが Web サイトでユーザ名とパスワードを入力した際、ブラウザはその値を記憶するかユーザに尋ねます。ユーザがその Web サイトを再び訪れた際には、ログインフィールドがブラウザに保存された値でオートフィルされます。
加えて、ユーザがマスターパスワードを設定すると、ログイン情報をマスターパスワードで暗号化した状態でブラウザに保存することができます。
マスターパスワードが用いられない場合でも、ブラウザのパスワード管理機能は純粋にセキュリティの向上につながります。パスワードをブラウザが保存すればユーザは覚えなくてもよいため、覚えなければならない場合よりも強固なパスワードをユーザが設定できるようになります。
このような理由から、モダンブラウザの多くはログインフィールドにおける autocomplete="off"
をサポートしていません。
- Web サイトが
<form>
にautocomplete="off"
を設定しており、かつその<form>
内にユーザ名とパスワードの<input>
フィールドが含まれていた場合でも、ブラウザはログイン情報を記憶するか尋ねることになります。そしてユーザが同意すれば、次回の訪問時にログインフィールドをオートフィルします。 - Web サイトがユーザ名とパスワードの
<input>
フィールドにautocomplete="off"
を設定していた場合でも、ブラウザはログイン情報を記憶するか尋ねることになります。そしてユーザが同意すれば、次回の訪問時にログインフィールドをオートフィルします。
この挙動は Firefox 38 以降、Google Chrome 34 以降、Internet Explorer 11 以降で共通です。
他人のパスワードを指定するようなユーザ管理画面において、パスワードフィールドのオートフィルを抑止したい場合、autocomplete="new-password"
を指定するべきです。ただし、この機能はどのブラウザでもまだ実装されていません。