年齢確認は、チェックボックスからエンジニアリングの課題に変わりました。英国では、Online Safety Actが一部のサービスに「高度に効果的な」年齢確認を求めています。EUでは、欧州委員会が、それ以外の情報を一切渡さずに18歳以上であることを証明するためのブループリント(設計図)を公開しました。どちらも、本人確認書類を入り口の一つとして挙げています。
この記事は、「年齢確認を追加して」と頼まれ、本人確認書類のスキャンがどこに当てはまるのかを知りたい開発者向けです。英国とEUの当局が挙げている方法、パスポートやIDカードのスキャンで証明できることとできないこと、生年月日を「基準年齢以上か未満か」の答えに変える方法、そして確認後に何を残すべきかを扱います。以下の引用はすべて当局自身のページからのもので、引用箇所にリンクを付け、日本語に訳しています。
これはパスポート・身分証OCR API、doc.cheapのブログです。製品に触れる部分は、その前提で読んでください。
英国:基準は「高度に効果的」
義務はOnline Safety Act 2023のsection 12に定められています。最も有害な種類のコンテンツについて、事業者は「あらゆる年齢の子どもが、子どもに有害な最優先コンテンツに接するのを防ぐため、年齢確認または年齢推定(またはその両方)を用いる」必要があります。そして、その確認は「特定の利用者が子どもかどうかを正しく判定するうえで高度に効果的であるような種類のものであり、またそのような方法で用いられる」ものでなければなりません。
section 230は2つの用語を定義しています。年齢確認とは「対象サービスの利用者の正確な年齢を確認するために設計されたあらゆる措置を意味する」。年齢推定とは「利用者の年齢または年齢層を推定するために設計されたあらゆる措置を意味する」。さらに、最も手軽な抜け道も塞いでいます。「利用者に自分の年齢を自己申告させる措置(それ以上のものがないもの)は、年齢確認または年齢推定とはみなされない。」
英国の通信監督機関であるOfcomは、Part 3のサービス向けの高度に効果的な年齢確認に関するガイダンス(更新版の日付は2025年4月24日)でこの基準を説明しています。セクション3では、高度に効果的になりうると考える方法の「網羅的ではない一覧」を示しています。
| Ofcomの一覧にある方法 | 本人確認書類が関わるか |
|---|---|
| オープンバンキング | いいえ |
| 写真付き身分証の照合(photo-ID matching) | はい、書類そのものが証拠 |
| 顔による年齢推定 | いいえ |
| 携帯電話事業者による年齢確認 | いいえ |
| クレジットカードによる確認 | いいえ |
| メールアドレスに基づく年齢推定 | いいえ |
| デジタルアイデンティティサービス | 多くの場合、身元を最初に確認する時点で |
Ofcomは写真付き身分証の照合を次のように説明しています。この方法は「アップロードされた写真付き身分証から必要な情報を取得し、身分証のアップロード時点の利用者の画像と比較して、同一人物であることを確認することで機能する」。
同じセクションには、基準を満たさないものも挙がっており、その中に「この情報を裏づける追加の証拠なしに、利用者に生年月日を入力させること」が含まれています。入力された生年月日は自己申告です。書類から読み取った生年月日は証拠であり、Ofcomのガイダンスの残りの部分は、その証拠がどれほど良質でなければならないかについてのものです。
EU:年齢の証明を土台にしたブループリント
EU側では、欧州委員会が2025年7月14日に年齢確認ブループリントの第1版を公開しました。委員会の言葉では、このブループリントは「オンラインポルノなど、制限された成人向けコンテンツにアクセスする際に、他の個人情報を一切明かさずに利用者が18歳以上であることを証明できる方法を提供する」ものです。
この設計は、確認と利用を切り離しています。利用者の「年齢は、生年月日などの詳細な個人データを用いて発行者が確認する。しかし、オンラインサービスが受け取るのは、利用者が18歳以上であるという証明だけで、他の個人情報は一切含まれない」。
本人確認書類が登場するのは最初の段階です。委員会のブループリントに関するファクトページは、年齢の証明の情報源として「国のeID、パスポートとIDカード、銀行アプリなど年齢情報を持つプリインストールのアプリ、または郵便局などの第三者によるオフラインでの有効化」を挙げています。さらに、「2025年10月には、パスポートとIDカードによって年齢の証明を生成する方法を備えたブループリントの第2版が公開された」と付け加えています。
つまり、どちらでも書類は認められた入力です。そして、どちらでも書類の写真だけで確認のすべてが済むわけではありません。
スキャンで証明できること、できないこと
書類のスキャンは、「この書類には何が書かれているか」という1つの問いにはよく答えます。生年月日、有効期限、書類の種類、機械読取領域(MRZ)を読み取り、その領域のチェックディジットが合っているかどうかも教えてくれます。これがOfcomの説明でいう「必要な情報を取得する」部分です。
年齢確認がカバーすべき他の問いには答えません。
- その人は書類の持ち主か。 Ofcomの堅牢性に関するセクションは、わかりやすい抜け道を挙げています。「子どもの利用者が、自分のものではない身分証の画像をアップロードする」ことです。その答えは、「写真付き身分証の照合において、身分証のアップロード時点で利用者の写真を求めることは、その身分証がその利用者のものであることの確認に役立つ」というものです。
- その人はその場にいるか。 「ライブネス検出は、年齢確認の手続きを受けている利用者が確認の実施時点でその場にいることを確かめることで、子どもの利用者が大人の写真をアップロードしていないという確信をさらに高める。」
- 書類は本物か。 「堅牢な写真付き身分証の確認は容易に回避できるものであってはならず、したがって写真付き身分証による方法は、子どもが作成または入手しうる偽造書類や改ざんを検出できるべきである。」
これらはどれもOCRの仕事ではありません。書類を読むことと書類を検証することは別の仕事で、別のツールが担います。書類に基づく年齢確認には、その両方が必要です。読み取りの段階は書類についての信頼できるデータを与え、顔照合、ライブネス確認、真正性確認は、その書類と人物を信頼してよいかどうかを教えてくれます。
生年月日から「以上か未満か」へ
生年月日を読み取れたら、年齢の計算は短いものの、間違えやすいところです。年を引くだけでは足りません。2008年11月20日生まれの人は、2026年11月10日時点では18歳ではなく17歳です。月と日も比較してください。
from datetime import date
def age_on(birth_iso: str, on: date) -> int:
"""Whole years completed on the day `on`, from a YYYY-MM-DD date of birth."""
born = date.fromisoformat(birth_iso)
years = on.year - born.year
if (on.month, on.day) < (born.month, born.day):
years -= 1 # the birthday has not come yet this year
return years
def is_over(birth_iso: str, threshold: int, on: date) -> bool:
return age_on(birth_iso, on) >= threshold
print(age_on("2008-11-20", date(2026, 11, 10))) # 17
print(is_over("2008-11-20", 18, date(2026, 11, 20))) # True
実務では、いくつかの細部が効いてきます。
- 確認日を、1つのタイムゾーンで使う。 サーバーの「今日」と利用者の「今日」は、深夜0時前後で食い違うことがあります。ルールを1つに決め、使った日付をログに残してください。
- 2月29日。 上の比較では、2月29日生まれの人は、2月29日がない年には3月1日に年齢が1つ上がります。あなたの法域で扱いが異なる場合は、その分岐だけを変えてください。
- 日付がないことは答えではない。 スキャンで生年月日が返らなかった場合の結果は「確認できない」であり、決して「18歳以上」ではありません。
- 有効期限は別の問い。 期限切れの書類を証拠として認めるかどうかはあなたのポリシーです。有効期限を読み取り、明示的に判断してください。
残すのは答えであって、書類ではない
欧州委員会の設計では、サービスに送られるのは「利用者が18歳以上であるという証明だけ」です。同じ考え方は自社のシステムでも使えます。確認が終われば、必要なのは真偽値と日付であり、パスポートの画像ではありません。
Ofcomのプライバシーに関するセクションも同じ方向を指しています。事業者に対し、「すべての年齢確認の方法は個人データの処理を伴い、データ保護バイデザインの考え方に従うべきである」と念を押し、従うべき原則としてデータの最小化と保存期間の制限を挙げています。
最小限の記録は次のようになります。
{
"user_id": "u_3f9c",
"check": "age_over_18",
"result": true,
"checked_on": "2026-11-10",
"method": "photo_id_matching"
}
画像も、書類番号も、生年月日もありません。法律でそれ以上の保存が求められるなら、その分だけを、独自の削除日を持つ1つの保存先に保管してください。
doc.cheapの位置づけ
doc.cheapはパスポート、IDカード、運転免許証を読み取り、印字された内容をJSONで返します。年齢確認で役に立つフィールドは、ISO形式 YYYY-MM-DD の日付または null である holder.birth_date と、document.expiry_date、document.is_expired、mrz.status です。これにより、age_on に渡す日付は、妥当性を確かめられる読み取り結果から得られます。
これは読み取りのサービスであって、検証のサービスではありません。認識のみのシナリオでは、応答の authenticity.overall は not_checked になり、顔照合とライブネスの段階はそれ専用のツールに任せます。また、求められないものは何も保存しません。ライブキーで retain_hours: 0 を指定すると1行も書き込まれないことは、履歴の保存期間ガイドで説明しています。画像そのものは一切保存されません。
残りを設計する前に読み取りの段階を試すには、無料のパスポートOCR APIから始めてください。提供元を選んでいるなら、パスポートOCR APIの比較で公開されている料金を並べて確認できます。
これは技術的なまとめであり、法的助言ではありません。
**最後に質問です。**あなたの年齢確認で、正しく仕上げるのに最も時間がかかったのはどの部分でしたか – 読み取り、顔照合、それとも残す記録でしょうか。下のコメント欄で教えてください。