CORS とは何か - セキュリティの観点から初心者向けに解説
Web ブラウザーのセキュリティ機能である CORS (Cross-Origin Resource Sharing) について、「なぜ必要なのか」「何が危険なのか」を初心者向けに解説する。正しく理解することで、セキュアな Web 開発が可能になる。
Web ブラウザーのセキュリティ機能である CORS (Cross-Origin Resource Sharing) について、「なぜ必要なのか」「何が危険なのか」を初心者向けに解説する。正しく理解することで、セキュアな Web 開発が可能になる。
このブログのモバイル PageSpeed Insights スコアを Performance 99、Accessibility 100、Best Practices 100、SEO 100 まで改善した。SEO・パフォーマンス・アクセシビリティの各観点から、実施した変更をまとめる。
このブログにコメント機能を追加したくなり、AWS サーバーレスで API を自作しました。その設計と実装について紹介します。
リクエストは以下の流れで処理されます。
ブラウザ (www.hikari-dev.com)
↓ HTTPS
API Gateway
├── GET /comment?postId=... → コメント取得
├── POST /comment → コメント投稿
└── PATCH /comment/{id} → 管理(非表示切り替え)
↓
Lambda (Node.js 20 / arm64)
↓
DynamoDB(コメント保存)
+ SES v2(管理者へのメール通知)
コードは TypeScript で書き、SAM(Serverless Application Model)で IaC 管理しています。Lambda は arm64(Graviton2)にして少しコストを抑えています。
テーブル名は blog-comments、パーティションキーは postId、ソートキーは commentId です。
| キー | 型 | 説明 |
|---|---|---|
postId | String | 記事の識別子(例: /blog/2026/03/20/hime) |
commentId | String | ULID(時系列ソート可能な ID) |
ソートキーに ULID を使っているので、QueryCommand で取得したコメントは投稿順に自動的に並びます。UUID にしなかったのはこの理由です。
コメントを DynamoDB に書き込む前に、keywords.json に定義したキーワードと照合します。
キーワードにヒットした場合は isHidden: true で自動非表示にし、isFlagged: "1" を付与します。ヒットしなければ即時公開です。
isFlagged は Sparse GSI のキーとして使っています。ヒットしないコメントにはこの属性を持たせないため、GSI に余計なパーティションが増えず、コストと効率の両面で有利です。DynamoDB Document Client の removeUndefinedValues: true を設定するだけで実現できます。
コメントが投稿されるたびに SES v2 で自分宛にメールが届きます。本文には投稿者名、本文、評価、IP アドレス、フラグ状態が含まれます。
メール送信は非同期で行い、失敗しても握りつぶします。コメント投稿のレスポンス速度に影響しないようにするためです。
DynamoDB には IP アドレスや User-Agent も保存しますが、GET エンドポイントのレスポンスには含めません。型定義レベルで分離しています。
| 層 | 対策 |
|---|---|
| ネットワーク | AWS WAF で 100 req / 5 分 / IP のレート制限 |
| CORS | https://www.hikari-dev.com のみ許可 |
| 管理 API | API Gateway の API キー認証(X-Api-Key ヘッダー) |
| スパム | キーワードフィルタで自動非表示 |
管理エンドポイント(PATCH /comment/{id})は SAM テンプレートで ApiKeyRequired: true を設定するだけで API キー認証が有効になります。Lambda Authorizer を自前で実装する必要がなく、シンプルです。
サーバーレス構成なのでサーバー管理も不要で、DynamoDB のオンデマンド課金により低トラフィックな個人ブログでもコストを最小限に抑えられています。
コードは SAM + TypeScript + esbuild でまとめており、sam build && sam deploy だけでデプロイできます。
平成 30 年に取得したマイナカード、 何に使ってどう便利だったかをまとめる。 不便なところもまとめる。
わざわざ、市役所 (出張所) に出向き、並ぶ必要がないので便利。
今後はマイナンバーカードがないと本人確認は厳しいかも。 社会も性善説では通用しなくなってきてるし、仕方ないかも。 運転することはないのに、身分証明のために運転免許証を取るといったことはしなくていいのでそこは良い。多分、2割くらいはいそう。
フォームに数値を打ち込んで送信するだけだった。医療費控除の計算もできるし、便利。
保険証を持ち歩かなくて済むのはいいが、 資格確認システムのバグで利用できなくて困ることが何回かあったので、念のため保険証を持ち歩くのがよさそう。 薬局で処方された医薬品情報がマイナポータルで確認できるのが便利。(薬のアレルギー持ちの人は特に) マイナカードを利用せず、保険証で利用したところは、 医療費の計算をしてくれるのかな?そこはちょっとわからない。
3月末の混む時期に市役所 (出張所) に行って、転出届を出すのは気が滅入るが、マイナポータルを利用し転出届がオンラインで出せる。 注意しなければならないことは、転入届を忘れないこと。 (ちなみに、市役所・区役所行くより、出張所のほうが混んでないのでおすすめ。) 転入時にマイナンバーの暗証番号も再設定しなければいけないのが面倒だった。
スマホにマイナンバーの電子証明書を搭載できる。 マイナポータルにカードレスでログインできるので便利かも。
スマホアプリの NFC スマホに電子証明書を搭載しているのに、毎回 NFC を要求される。NFC を有効にしておかなければアプリが開かないのは不便なので、改善を期待したい。
マイナンバーが記載されている マイナンバーカードにマイナンバーを記載することで、 紛失したときのリスクがある。とはいっても悪用は考えづらいが。クレジットカードのようにナンバーレスにしてほしい。
写真がモノクロ マイナンバーカードに内蔵されている写真はモノクロ。 なぜカラーにしなかった。
更新が面倒 電子証明書のセキュリティの関係で更新が 5 年だとか。 しかし、有効期間は 10 年間。 おいおい。 改善されるとかされないとからしいが。
カードが使えない病院 国から補助金がいくらか出ているそうなので、対応してほしい。
暗証番号の種類が多い 暗証番号の種類が 4 種類もある。1 種類にしてほしいが、 セキュリティ的に難しいのだろうか。わからん。
券面がダサい 無線従事者の免状を見習ってほしい。
マイナカードの的外れな批判が多いのでまとめていく。 批判する前に、仕組みを理解してほしい。
マイナカードから紐づけされた個人情報が抜かれる これは、一部正しい。 マイナカードそのものには住所、氏名、性別、生年月日などの基本的な個人情報しか存在しない。運転免許証よりも情報は少ないだろう。 マイナカードと紐づけされた情報を見るには、その紐づけされたサイトを開き、マイナカードから認証する必要がある。 紐づけされた情報はマイナカードと暗証番号がないとみられないわけだ。もちろん、カードに暗証番号を書いて、そのカードをなくしたりしたら、様々な個人情報が抜かれる可能性はある。この点はキャッシュカードと似てる。
暗証番号が 4 桁しかなく、セキュリティが甘い セキュリティが甘いのは誤り。 パソコンで SNS へのログインを考えてみると、ID とパスワードでログインできる。 SNS では ID は簡単にわかるので、パスワードがあればログインができる。いくらパスワードが複雑だろうと、一要素認証なわけだ。 一方マイナンバーカードは、カードの所持+暗証番号の知識という二要素認証となっている。 Windows などで、PIN コードでログインできるようになっているのも、複雑なパスワードを用いた一要素認証よりも、所持+記憶の二要素認証のほうがセキュリティが高いと言われているからだ。
保険証の紐づけの誤り これは、保険組合の紐づけミス、ヒューマンエラーである。 マイナカードはあくまでも個人認証する仕組みしかなく、マイナカードの問題ではない。 しかし、保険組合で紐づけるミスをどうにかしろというのはある。 保険証情報はマイナポータルで確認できるので、一度確認したほうが望ましい。
マイナカードなしで窓口 10 割負担なんてとんでもない 従来と同様、保険組合で手続きすることで返金を受けられる。 とはいっても資格証明書という本末転倒な仕組みを導入するそうだが。
Ubuntu 22.04 は snap 版の Firefox がインストールされているらしく、 環境によって起動ができなかったので、ビルド済み Firefox のインストールの方法をメモ。
sudo apt purge firefox
sudo snap remove firefox
# ダウンロード
wget "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=ja" --trust-server-names
# 展開
tar xvf firefox-*.tar.bz2
# 配置
sudo cp -r firefox /usr/lib
# 実行ファイルのシンボリックリンクを作成
sudo ln -s /usr/lib/firefox/firefox /usr/bin/firefox
# デスクトップファイルをダウンロードし配置
sudo mkdir -p /usr/share/applications
sudo wget https://bit.ly/3Mwigwx -O /usr/share/applications/firefox.desktop
アイコンを作成します。

16、24、32、48、64、128、256 の7種類の大きさの PNG 画像を用意します。

convert アイコンでアイコンを作成します。
convert *.png favicon.ico