タグアーカイブ Next.js

Next.js制作会社の比較で見るべきは、公開後の表示速度と拡張性だ

Next.js制作会社の比較で見るべきは、公開後の表示速度と拡張性だ

Next.js制作会社を比較するとき、価格表を最初に見るのは遠回りだ。

公開した後も表示が速く、機能を足し続けられるかを見るほうが、結果として費用を抑えられる。

表示速度と拡張性は後から足すことが難しく、最初の構成でほぼ決まる。

だから制作会社を選ぶ段階で、その設計方針を確かめる必要がある。

私たちはWordPressからの移行を含むNext.jsのサイト構築を請け負っている。

この仕事で実際に採用している基準が、そのまま比較のポイントになる。

Next.js制作会社を比較するとき、最初に何を見ればよいか

Next.js制作会社を比較するとき、最初に何を見ればよいか

公開後にサイトをどう育てるかの設計方針を見るべきだ。

Next.jsで作るなら、表示速度や多言語対応は後から足すより最初に組み込むほうが安く確実にできる。

後付けできる範囲と、後付けでは難しい範囲を分けて確かめる。

後から足せる範囲と足せない範囲を知る

ReactベースのNext.jsは部品を組み合わせて作る。

新しい機能を追加する余地は、公開後も残る。

一方、ページをあらかじめ生成する仕組み、管理画面と表側の分離、多言語の設計は後付けでは間に合わない。

気づいた時には、一部分の修正ではなく、サイトの骨格から組み直す工事になっている。

公開後の運用費がどこまで続くかを見積もる

運用費はサーバー代、保守、機能追加の工数で構成される。

管理画面に特定の製品を固定した構成では、更新方法を変えたくても製品の制約で動けないことがある。

更新する人の使い心地と毎月の費用から管理画面を選べるかどうかが、公開後の支出を左右する。

表示速度は後から改善できるのか

表示速度は後から改善できるのか

ページの表示が遅い根本原因がデータベースとの兼ね合いなら、後付けの改善では限界がある。

Next.jsで最初に事前生成とCDN配信を組み込めば、開いた瞬間に表示される構成が出来上がる。

私たちはこの構成を標準にしている。

事前生成とCDN配信のしくみ

WordPressは閲覧のたびにデータベースを呼ぶ。

記事や商品が増え、アクセスが重なると、この呼び出しが表示を遅くする。

Next.jsでは記事や商品のページをあらかじめ生成しておき、CDNと呼ばれる世界中の配信拠点から届ける。

閲覧のたびにデータベースを呼ばないため、どこからアクセスしても最初の表示が速い。

後から足す高速化との違い

速くする施策を後付けすると、キャッシュの設定や表示の条件分岐が増える。

構成が複雑になり、更新作業にしわ寄せが来る。

一度は速くなったように見えても、機能を足すたびに表示速度を気にしながら直し続けることになる。

私たちは最初から事前生成とCDN配信を組み込むため、公開後に表示速度のための追加工事がいらない。

管理画面の構成で何が変わるのか

管理画面の構成で何が変わるのか

管理画面は固定製品を押し付けるのではなく、案件で選ぶべきだ。

更新する人の使い勝手と毎月の費用は、この選択で大きく変わる。

私たちは3つの構成から、あなたのサイトに合うものを選ぶ。

3つの構成から選ぶ

構成向いているサイト費用の傾向
ヘッドレスCMS(Strapiなど)記事が中心のメディア中くらい
Cloudflare上の自作管理画面軽さと安さを優先するサイト抑えめ
EC向けの構成カートや決済、在庫を扱うネットショップ要件で変わる

決め打ちの製品との違い

管理画面の製品を1つに決めている制作会社では、更新画面の使い勝手を変えたくても製品の仕様に縛られる。

私たちは商品の登録に手間がかかると分かればEC向け、記事の投稿が中心と分かれば記事の編集に強い構成へ切り替える。

更新する人が無理なく触れる画面を、サイトの用途から逆算して決める。

多言語サイトや会員機能は後から足せるのか

多言語サイトや会員機能は後から足せるのか

多言語は後付けにするとURLの設計や翻訳の管理まで組み直しになる。

会員機能も、認証の仕組みを後から入れると保守の手間が増える。

要件が分かっているなら、最初の設計に含めるべきだ。

私たちは言語と拡張機能を設計の段階から扱う。

多言語を最初から設計する理由

私たちは15か国語に対応したSaaSを開発・運営してきた。

多言語でつまずくのは翻訳の登録ではなく、サイトの構造に言語をどう割り当てるかだと分かっている。

後付けだと、日本語版と英語版でURLが不揃いになるなど、あとから直しにくい問題が出る。

最初に言語の設計を含めておけば、翻訳が増えても骨格はそのままだ。

会員機能を標準的なCMSに足すときの代償

CMSが標準で持たない機能を後から足すと、本体の更新に追従できなくなる。

会員機能や外部システムとの連携は、私たちのように設計の時点から組み込むことが必要だ。

あなたのサイトで会員機能を使う予定があるなら、制作会社の比較の段階でその経験と実装方法を聞いたほうがよい。

Next.js制作の見積もりは何によって変わるのか

Next.js制作の見積もりは何によって変わるのか

私たちの見積もりと相談は無料だ。

費用はページ数、既存サイトからの移行の有無、多言語やEC機能の有無で変わる。

金額自体は、作りたいサイトの規模を見ないと出せない。

ここでは何が費用を動かすかを整理する。

費用を動かす条件

  • ページ数
  • 既存サイトからの移行の有無
  • 多言語の有無
  • EC機能の有無

別途かかる実費

クラウドの利用料は依頼側の負担になる。

ただしアクセスが少ない立ち上げ期は、クラウドの無料枠で始められる構成を提案する。

訪問が増えた分に合わせて広げられるため、初期の費用を抑えながら始められる。

動かす先はVercel、Cloudflareなどのクラウドに限り、一般的なレンタルサーバーには設置しない。

いまのドメインとサーバーの契約状況も相談時に教えてほしい。

相談する前に決めておくこと

相談する前に決めておくこと

WordPressから移るべきか迷っているなら、いまのサイトのURLとやりたいことを教えてください。

移らなくてよい場合は、そうお伝えします。

デザインデータが無い場合も、テンプレートをもとに進めるため、目的と規模を聞かせてもらえれば十分です。

事前に生成した速い表示と、管理画面を表に出さない構成で組み立てます。

公開後は、作り直しに消えていたはずの時間が、まるごと事業を伸ばす側へ回ります。

売り先を海外まで広げる準備も、設計の段階から含めて進めます。

詳しくはモダン技術によるサイト新規構築のページをご覧ください。

モダン技術によるウェブサイト新規構築WordPressから移るサイトやネットショップを、Next.jsを中心にしたモダンな構成で、案件に合う管理画面と組み合わせて作るサービスの詳細を見る

相談と見積もりは無料です。

よくある質問

WordPressから移るべきか、いまのサイトを直すべきかはどう判断する?

実際のサイトのURLとやりたいことを見ないと判断できない。

私たちは移行ありきでは応じない。

いまの構成を直せば足りるなら、そう伝える。

デザインデータが無いが、依頼できるか?

できる。

テンプレートをもとに組み立てる。

目的と規模を聞かせてもらえれば、そこから進められる。

サーバーはどう用意すればよいか?

動かす先はVercel、Cloudflareなどのクラウドになる。

一般的なレンタルサーバーには設置しない。

いまのドメインとサーバーの契約状況を相談時に知らせてほしい。

多言語対応は後からでもできるか?

後からでも対応はできるが、URLや翻訳管理の組み直しが発生する。

言語を増やす計画があるなら、最初の設計に含めるほうが安く確実だ。

見積もりは無料か?

見積もりも相談も無料だ。

費用は、ページ数、既存サイトからの移行の有無、多言語やEC機能の有無で変わる。

この記事のポイント

  • Next.js制作会社の比較では、価格表より公開後の表示速度と拡張性を見る
  • 表示速度は後付けでなく、事前生成とCDN配信を最初に組み込むことが分かれ目になる
  • 管理画面は記事中心、軽さと費用、ネットショップの3つから選ぶ
  • 多言語や会員機能は、要件があるなら最初の設計に含めるべきだ
  • 費用はページ数、移行の有無、多言語やEC機能で決まる。相談と見積もりは無料
モダン技術によるウェブサイト新規構築WordPressから移るサイトやネットショップを、Next.jsを中心にしたモダンな構成で、案件に合う管理画面と組み合わせて作るサービスの詳細を見る
React2Shellに学ぶReact Flightプロトコルの脆弱性と防御策

React2Shellに学ぶReact Flightプロトコルの脆弱性と防御策

WordPressをヘッドレスCMSとしてReactやNext.jsでフロントエンドを構築するプロジェクトが増えている。その中核となるReact Server Components(RSC)では、サーバーとクライアントの通信にFlightと呼ばれる独自のストリーミングプロトコルが使われる。しかし2025年12月、このFlightプロトコルにCVSS 10.0のリモートコード実行の脆弱性(CVE-2025-55182、通称React2Shell)が発見され、大きな話題となった。

本記事では、Flightプロトコルの仕組みと、なぜこれほど深刻な攻撃が可能になるのかを解説する。さらに、React2Shellの詳細な攻撃手法と、WordPressのヘッドレス構成でもすぐに実践できる防御策をランキング形式で紹介する。

Flightプロトコルとは何か(仕組みと危険性)

Flightプロトコルとは何か(仕組みと危険性)

React Server Componentsがブラウザに送るのはHTMLでもJSONでもない。サーバーコンポーネントがレンダリングされると、text/x-componentというContent-Typeで行区切りのテキストストリームが流れる。このフォーマットをFlightと呼ぶ。各行は「行ID:タグ+ペイロード」の形式で、Reactランタイムがストリームを読みながらクライアント側のUIを再構築する。

例えば、次のような単純なペイロードを見てほしい。行1はIタグでクライアントコンポーネントの読み込みを指示し、行2はJタグで仮想DOMを組み立てる。行0のDはサーバー側の実行コンテキストだ。これだけでも複数の役割と参照が絡み合っていることがわかる。

通常のFlightペイロード(Before)
行0 D{“name”:”RootLayout”}
行1 I[“./ClientComp.js”, …]
行2 J[“$”,”article”,null,{“children”:”$1″}]
※ 行2の “$1” が行1のコンポーネントへの参照
↓
攻撃者が細工したペイロード(After)
行1 {“malicious”:{“__proto__”:null},”hijack”:function(){…}}
行2 J[“$”,”article”,null,{“children”:”$1:__proto__:constructor:constructor”}]
※ “$1:__proto__:constructor:constructor” がプロトタイプ汚染を誘発

Flightプロトコルは、単なるJSON形式ではない。$接頭辞によってクライアントサイドで実行するコードやモジュール読み込み、サーバーアクションのRPC呼び出しを再構成する。この仕組みが強力であるほど、入力が攻撃者に操作された場合の危険性も増す。

具体的には、$Fは呼び出し可能なサーバー関数を表し、$Lは遅延読み込みコンポーネント、$@は内部的なPromiseラッパーへの参照を返す。中でも$:は$1:user:nameのようにコロン区切りでオブジェクトのプロパティをたどる機能で、もしパスに__proto__やconstructorが含まれるとプロトタイプチェーンを遡ることになる。これが設計上の重大な問題の始まりだ。

React2Shell(CVE-2025-55182)の攻撃メカニズム

React2Shell(CVE-2025-55182)の攻撃メカニズム

2025年12月に公表されたCVE-2025-55182は、Flightのデシリアライゼーション処理に潜むCVSS 10.0のリモートコード実行の脆弱性だ。認証不要の1回のHTTPリクエストでサーバーにシェルアクセスを許す。CISAは直ちに「悪用が確認された脆弱性カタログ」に追加し、北朝鮮の国家支援ハッカーが数時間以内に攻撃を開始したとSysdigが報告している。

根本原因はgetOutlinedModel関数にある。この関数は$1:user:nameのような参照を解決する際、コロンでパスを分割し、単純にparentObject[segment]でプロパティアクセスを繰り返す。hasOwnPropertyによるチェックは一切なかった。

STEP 1 $1:__proto__:constructor:constructor で Function コンストラクタに到達
↓
STEP 2 $@0 で内部 Chunk オブジェクトを取得(生のラッパー)
↓
STEP 3 Chunk の .then をハイジャックし Thenable 化
↓
STEP 4 _response._formData.get を Function に差し替え
↓
STEP 5 $B0 でブロブハンドラを発火 → 任意コード実行

このガジェットチェーンは、Flightの持つ機能を悪用し、1回のHTTPリクエストでサーバーを乗っ取る。ログインも認証も不要だ。最終的に攻撃者はNode.jsプロセスの権限で任意のコマンドを実行できる。

SYSDIGの調査では、この脆弱性を利用した「EtherRAT」と呼ばれるファイルレス型インプラントが、イーサリアムブロックチェーンをC2通信に使う「EtherHiding」手法で展開され、テイクダウンが極めて困難だった。またPalo AltoのUnit 42は、感染Linuxシステムで正規のカーネルスワップデーモン(kswapd0)に偽装するバックドア「KSwapDoor」を確認している。

修正パッチの内容と限界

修正パッチの内容と限界

Reactチームはモジュールロード時にObject.prototype.hasOwnPropertyをキャッシュし、以後すべてのプロパティチェックでこれを使うパッチを適用した。これにより、攻撃者が__proto__を経由する試みはブロックされる。修正はReact 19.0.1、19.1.2、19.2.1に含まれており、既知のガジェットチェーンを完全に無効化する。

しかし、パッチはプロパティ探索のモデルそのものは維持している。$:プレフィックスは依然としてコロン区切りのパスを走査し、所有権を検証するようになっただけだ。設計上の根本問題は残っており、今後の新たなバイパスがこの領域から出てくる可能性は否定できない。Smashing Magazineの筆者も「プロパティ探索をネットワークプロトコルに露出させたこと自体が設計ミスだ」と指摘している。

実践的な防御策(影響度順ランキング)

Reactのパッチに頼るだけでなく、アプリケーションレベルで複数層の対策を取ることが肝心だ。以下は、実際の攻撃を防ぐ効果が高い順に並べた防御策である。

1. Server Actionの厳格な入力バリデーション(Zod、Valibot)

最も即効性があるのは、すべてのサーバーアクションの先頭でスキーマバリデーションを行うことだ。Flightデシリアライザはアプリケーションロジックより先に生データを処理するため、バリデーションが唯一の事前防御になる。ZodやValibotを使い、型、文字列長、数値範囲、列挙値を厳密にチェックする。

特に注意すべきは、引数を分割代入する前にバリデーションを済ませることだ。分割代入の時点で未検証のオブジェクトにアクセスしているため、まさにその操作が悪用される可能性がある。またエラーハンドリングでは.safeParse()を使い、内部情報が漏れないようにする。

2. server-only パッケージ

データベース接続やAPIキーを含むファイルの先頭にimport "server-only"を入れるだけで、クライアントコンポーネントへのトランスパイル時エラーを発生させる。バレルファイル(複数のエクスポートをまとめるindex.ts)による意図しないエクスポートには細心の注意が必要だが、コードの境界を強制するシンプルで強力な手段だ。

3. CSRF対策の強化

Next.js 16.1.7で修正される前に発見されたCVE-2026-27978は、サンドボックス化されたiframeから送られるOrigin: nullをNext.jsがクロスオリジンとみなさないバグだった。対策として、セッションクッキーにSameSite=Strictを設定し、重要な操作には独自のCSRFトークンを実装する。またexperimental.serverActions.allowedOriginsに'null'を絶対に追加しないこと。これだけでCSRFバイパスを再び開放してしまう。

4. パッチ適用バージョンの維持

React2ShellのRCE修正は19.0.1、19.1.2、19.2.1で行われたが、それ以降にDoSの脆弱性(CVE-2025-55184、CVE-2025-67779、CVE-2026-23864)も複数回修正されている。最新のセキュリティリリース(19.0.4以上、19.1.5以上、19.2.4以上)に追随することが不可欠だ。

5. Taint API(実験的)

experimental_taintObjectReferenceやtaintUniqueValueは、オブジェクトや文字列が誤ってクライアントにシリアライズされるのを防ぐ。しかしこれはオブジェクト参照を追跡する仕組みであり、スプレッド構文や個別プロパティの受け渡しで追跡が途切れる。あくまで開発時のフェイルセーフとして捉え、セキュリティ境界にはしない方がよい。

6. WAF(Web Application Firewall)

WAFはNext-Actionヘッダー付きのPOSTリクエストを検査し、__proto__やconstructor:constructorを含むペイロードをブロックするルールを追加できる。しかし、攻撃者が検査バッファを超えるパディングを前につけることで簡単にすり抜けられるため、あくまでノイズ低減層と割り切るべきだ。

React2Shell以降の脆弱性と今後の課題

React2Shell以降の脆弱性と今後の課題

React2Shellの修正後も、Flightのデシリアライゼーション面では複数のCVEが報告されている。特に、入れ子になったPromiseによる無限再帰(CVE-2025-55184)とその不完全な修正(CVE-2025-67779)、zipbomb的なメモリ枯渇を起こすDoS(CVE-2026-23864)は、デシリアライザーのパッチがいかに難しいかを示している。また、サーバー関数が引数を文字列化するだけでソースコードが流出するCVE-2025-55183は、デバッグ用途のJSON.stringifyが裏目に出る好例だ。

さらに、パッチでは塞がれていない構造的なリスクも残る。Flightストリームは平文で、CDN改ざんやキャッシュポイズニングによる中間者攻撃を受けやすい。攻撃者が行単位で$Iや$Fを書き換えれば、任意のモジュールをロードさせたり、隠しRPCエンドポイントを埋め込んだりできる。また、server-reference-manifest.jsonが公開されていると、すべてのサーバーアクションIDが漏洩し、IDOR攻撃に直結する。暗号化されたクロージャ引数を複製するために静的キーが使われている場合も、ファイル読み取り権限さえ奪取できれば改ざん可能だ。

根本的には、ネットワーク越しにプロパティ探索や実行可能な参照を再構成させる設計が、今後も攻撃者に利用される可能性をはらんでいる。Reactチームは既知のガジェットを塞いだが、これまでの歴史が示すように、シリアライゼーションフレームワークの脆弱性は根絶が難しい。

この記事のポイント

  • React FlightプロトコルはJSONの延長ではなく、$接頭辞でクライアント側の実行可能コードやモジュール読み込みを指示する「振る舞いのシリアライゼーション」である。
  • CVSS 10.0のReact2Shellは、プロトタイプ汚染とChunkオブジェクト操作を組み合わせ、認証なしでRCEを達成した。
  • パッチはhasOwnPropertyチェックを追加したが、プロパティ探索の根本設計は変わっておらず、新たな攻撃が生まれる余地がある。
  • 実務では、Server Actionの先頭で必ずスキーマバリデーションを実施し、server-onlyでコード境界を強制し、CSRF対策を二重化することが最も効果的な防御となる。
  • Taint APIやWAFは補助的な防御に過ぎず、過信せずに多層防御を組み立てる必要がある。
Next.js 2026年5月セキュリティリリースの全容、13件の脆弱性を修正

Next.js 2026年5月セキュリティリリースの全容、13件の脆弱性を修正

Next.jsの開発元であるVercelは2026年5月7日、調整済みセキュリティリリースを公開した。React Server Componentsの上流脆弱性(CVE-2026-23870)への対応を含む、合計13件の脆弱性が修正されている。フレームワークを利用するすべての開発者にとって、即時のアップデートが強く推奨される内容だ。

今回のリリースで対処された問題は、サービス拒否(DoS)攻撃、ミドルウェアやプロキシのバイパス、サーバーサイドリクエストフォージェリ(SSRF)、キャッシュポイズニング、クロスサイトスクリプティング(XSS)と多岐にわたる。ただちにパッチを適用しなければ、本番環境が深刻な攻撃に晒されるリスクがある。

アップデートの概要と影響範囲

アップデートの概要と影響範囲

今回のセキュリティリリースはNext.js本体に加え、その根幹をなすReactの特定パッケージにも修正が及ぶ。Vercelの発表によれば、13件の脆弱性アドバイザリが一挙に解決された形だ。アドバイザリの内訳を見ると、攻撃の種類によって影響を受ける機能や設定が明確に分かれている。自社のプロジェクトがどのカテゴリに該当するかを把握することが、迅速な対応への第一歩となる。

Before(パッチ未適用)
⚠ 複数の脆弱性が存在
● ミドルウェア認証のバイパス
● React Server Components の DoS
● キャッシュポイズニング
● SSRF の潜在的リスク
↓
After(パッチ適用後)
✓ 13件の脆弱性を一括修正
● 認証機能が正常に動作
● DoS 攻撃から保護
● キャッシュへの不正注入を防止
● SSRF の脆弱性を遮断

13件の脆弱性が存在する「Before」の状態と、アップデートによってそれらがすべて解決された「After」の状態を比較したイメージだ。リリースによってセキュリティ上のリスクが一掃されることがわかる。

修正対象となったReactとNext.jsのバージョン

影響を受けるバージョンを把握し、修正済みの安全なバージョンへ移行する必要がある。今回のリリースで修正が提供されたバージョンは以下の通りだ。

まず、React本体については、19.0.6、19.1.7、19.2.6の3つのパッチがリリースされた。これらのバージョンでは、サーバーコンポーネントの通信用パッケージである react-server-dom-parcel、react-server-dom-webpack、react-server-dom-turbopack の各パッケージに修正が含まれている。

Next.jsをフレームワークとして利用している場合、これらのReactパッケージはNext.jsのバージョンにバンドルされている。そのため、開発者はNext.js本体を最新のパッチバージョンに更新することで、React側の修正も同時に適用できる。個別にReactパッケージを管理しているプロジェクトは、それらも忘れずにアップデートする必要がある。

各脆弱性の詳細とリスク評価

各脆弱性の詳細とリスク評価

ここからは、発表されたアドバイザリを深刻度別に整理し、その技術的な背景をひも解いていく。影響を受けるコンポーネントと、攻撃が成立するシナリオを正しく理解することが、開発者としての適切なリスク評価に繋がる。

ミドルウェアとプロキシのバイパス

認証や認可のロジックを middleware.js や proxy.js に依存しているアプリケーションが、致命的な影響を受ける可能性がある。2件の「高」深刻度アドバイザリがこれに該当する。

1件目はApp Routerにおける segment-prefetch のバイパスで、過去の修正が不完全だったための再発フォローアップだ。2件目はPages Routerのi18n機能において、デフォルトロケールのパスがプロキシ認証を迂回してしまう問題である。多言語サイトをPages Routerで運用しており、middlewareでアクセス制御を行っている環境は特に注意が必要だ。

サービス拒否(DoS)攻撃

サーバーのリソースを枯渇させ、正規のユーザーがサイトにアクセスできなくなるDoS攻撃に関する脆弱性が3件報告されている。これらはすべて、Server Functions、Partial Prerendering(PPR)のCache Components、もしくは画像最適化APIの利用が条件となる。

最もクリティカルなものは、React Server Componentsの上流脆弱性(CVE-2026-23870)を突いた攻撃だ。Vercelの発表によると、この脆弱性によりリモートからのDoS攻撃が成立する。また、Cache Componentsを使用するアプリケーションにおける「接続数の枯渇」を引き起こす脆弱性も「高」深刻度と評価されている。画像最適化APIを経由したDoSは「中」深刻度だが、無視できるものではない。

攻撃の流れ(イメージ)
攻撃者 → 悪意あるリクエスト送信 → 脆弱なNext.jsサーバー → リソース枯渇 → 正規ユーザーがアクセス不可
● 攻撃者  → 攻撃の流れ  ● 影響を受ける主体

この図は、悪意あるリクエストによってサーバーのリソースが消費され、本来のサービス提供が妨害されるDoS攻撃の基本的な流れを示している。Cache Componentsの脆弱性は、この「リソース枯渇」の段階を特に加速させる危険性がある。

サーバーサイドリクエストフォージェリ(SSRF)

SSRFは、攻撃者がサーバーを踏み台にして内部ネットワークへのリクエストを強制させる攻撃手法だ。今回の脆弱性は、WebSocketへのアップグレードリクエストを処理するアプリケーションが影響を受ける。

この種の攻撃が成功すると、攻撃者は本来アクセスできない内部のメタデータサービスやデータベースと通信できるようになる。クラウド環境(AWSやGCPなど)で稼働しているNext.jsアプリケーションは、特に深刻な被害に繋がる可能性があるため、迅速な対応が求められる。

キャッシュポイズニングとクロスサイトスクリプティング(XSS)

React Server Componentのレスポンスの前にキャッシュ層を配置しているアプリケーションは、キャッシュポイズニングのリスクに晒される。これは、攻撃者が悪意あるレスポンスをキャッシュサーバーに記憶させ、他のユーザーにその不正なコンテンツを配信させる攻撃だ。

XSSに関しては、App RouterでCSP(コンテンツセキュリティポリシー)のnonceを利用しているケース、そして外部からの信頼できない入力を消費する beforeInteractive スクリプトが影響を受ける。これらの設定は比較的高度なカスタマイズで使われるが、該当する場合はすぐに対処しなければ攻撃者によるスクリプト実行を許してしまう。

即時アップデートの必要性と対応手順

即時アップデートの必要性と対応手順

Vercelは今回のリリースに際し、新たなWAF(Web Application Firewall)ルールを展開していないと明言している。つまり、これらの脆弱性はWAFレベルで確実にブロックすることができず、パッチ適用が唯一の完全な緩和策となる。

アップデート手順の基本

まず、プロジェクトのNext.jsとReactのバージョンを確認する。package.jsonに記載されているバージョンが、今回の修正対象より古い場合は即座にアップデートを実行する。一般的な手順は以下の通りだ。

# Next.jsのアップデート
npm install next@latest

# 関連するReactパッケージも最新に
npm install react@latest react-dom@latest

yarnやpnpmなど、他のパッケージマネージャーを利用している場合も、同等のコマンドで問題ない。パッケージを更新した後は、必ずビルドとテストを実行し、アプリケーションが正常に動作することを確認してほしい。

本番環境でのリスク管理

今回のセキュリティリリースには、破壊的な変更は含まれていない。そのため、動作検証は必要だが、適用を躊躇する技術的理由はほぼない。重要なのは「スピード」だ。

とりわけ、middlewareで認証を実装しているサイト、WebSocketを処理するリアルタイムアプリケーション、そしてPPRやCache Componentsを採用しているパフォーマンス重視のサイトは、緊急度が極めて高い。Vercelの発表でも「all affected users should upgrade immediately(影響を受けるすべてのユーザーは直ちにアップグレードすべき)」と強い表現で呼びかけている。

今回のリリースが示すNext.jsセキュリティの潮流

今回のリリースが示すNext.jsセキュリティの潮流

一見すると大規模な脆弱性の一括修正はネガティブな出来事に思える。しかし、セキュリティの観点からは、むしろフレームワークの成熟度を示すポジティブなシグナルと捉えるべきだ。

まず、対策が「調整済みセキュリティリリース」として計画的に実施されている点が重要だ。これは、VercelとMeta(React)のチームが発見された問題を共有し、エコシステム全体で同時に対処する体制が整っていることを意味する。大規模なOSSプロジェクトでは、このような「調整済み開示」のプロセスがセキュリティ品質の生命線となる。

次に、脆弱性の範囲が「Server Components」「ミドルウェア」「エッジキャッシュ」「画像最適化API」といった、Next.jsの比較的新しい機能や高度な機能に集中している事実に注目したい。これは、攻撃者の標的が、従来のシンプルなWebアプリケーションから、エッジとサーバーを高度に組み合わせたモダンなアーキテクチャへとシフトしている証左だ。

SSRやエッジファンクションの利用が一般化するにつれ、開発者は「新しい機能がもたらす利便性」と「新たな攻撃表面が生まれるリスク」のバランスを常に意識する必要がある。便利なAPIほど、その裏側で何が起きているのかを深く理解することが、これからのフロントエンド開発者には不可欠だ。

この記事のポイント

  • Next.js 2026年5月セキュリティリリースは、ReactのCVE-2026-23870を含む13件の脆弱性を修正する
  • 影響範囲はDoS、ミドルウェアバイパス、SSRF、キャッシュポイズニング、XSSと多岐にわたる
  • WAFでは防げない脆弱性群のため、Next.jsとReact関連パッケージの即時アップデートが唯一の対策
  • とくに認証機能やServer Components系の新機能を使うプロジェクトは緊急度が高い
  • 調整済みリリースの実施は、Next.jsエコシステムのセキュリティ成熟度を示すポジティブな側面でもある
ヘッドレスCMSとWordPressの選び方、2026年版アーキテクチャ比較

ヘッドレスCMSとWordPressの選び方、2026年版アーキテクチャ比較

CMSの選定は2026年、技術的な好みの問題ではなくなった。その選択がマーケティングキャンペーンの展開速度、コンテンツ更新の自由度、ひいては収益に直結する。WordPressが世界のWebサイトの43.5%を支える支配的な存在である一方、ヘッドレスCMS市場は2027年までに16億ドルに達すると予測されている。

両者の違いは単なる「新しいか古いか」ではない。視覚的な構築の自由と、アーキテクチャの厳格な分離という、根本的に異なる哲学のせめぎ合いだ。本記事ではパフォーマンス、運用コスト、セキュリティ、SEO、そしてチームの働き方という実務の観点から、両アプローチを比較する。

根本的なアーキテクチャの違い

根本的なアーキテクチャの違い

アーキテクチャの議論は開発者だけの専門用語ではない。マーケティングチームが火曜の朝にランディングページを立ち上げられるかどうか、そのスピードを決める。この根本的な違いは採用戦略にも直接影響する。

従来のWordPressはモノリシック(一体型)システムだ。コンテンツデータベース、PHPの処理ロジック、HTML出力がすべて同じアプリケーション環境に同居する。ユーザーがリンクをクリックすると、サーバーはPHPスクリプトを実行しMySQLデータベースに問い合わせ、取得したデータをテーマテンプレートにはめ込み、最終的なHTMLをブラウザに返す。この一連の処理は一つのサーバー内で完結する。

一方、ヘッドレスはデカップルド(分離型)アーキテクチャと呼ばれる。コンテンツはContentfulやStrapiのようなクラウドデータベースに保存され、フロントエンドはReactやVueで構築された完全に別個のアプリケーションになる。フロントエンドアプリはAPIエンドポイントを通じて生のJSONデータを受け取り、コンテンツの見た目には一切関与しない。データの受け渡しと表示が完全に分離されているのだ。

なぜ開発者は分離を好むのか

Elementor Blogの記事によれば、最近のStack Overflow調査でヘッドレス技術への開発者関心が従来のPHPロールと比較して15%増加したという。彼らは「関心の分離」を重視する。バックエンドのコンテンツ管理とフロントエンドのUI実装が完全に切り離されることで、開発効率とコードの保守性が高まるからだ。

ただし、この分離にはトレードオフがある。マーケターがコンテンツの見た目をリアルタイムで確認する「ライブプレビュー」は、ヘッドレス環境では極めて面倒な課題として残っている。草案を確認するだけのために複雑なプレビューサーバーを構築しなければならないケースも多い。

ユーザー体験の決定的な差

ユーザー体験の決定的な差

ヘッドレスアーキテクチャがマーケティングチームを苦しめる最大の理由がここにある。技術的な純粋さと引き換えに、ワークフローの速度が犠牲になる。

WordPressの視覚的優位性

従来型WordPressは視覚的な構築体験で圧倒的に優位に立つ。Elementor Editor Proを例にとると、118種類以上のウィジェットを使ってCSSを一行も書かずにレイアウトを構築できる。コンテナをドラッグし、ブレークポイントを調整し、すぐに公開する。

ヘッドレスが生む開発者依存

ヘッドレス環境では、ヒーローセクションのレイアウトを変更したいだけでも、マーケターはJiraチケットを発行し、開発者がReactコンポーネントを更新し、GitHubにプッシュし、ビルドパイプラインの完了を待つという手順を踏まなければならない。毎週11本の記事を公開するチームにとって、この依存関係は数百時間の損失になりうる。

Elementor Blogで紹介されているAIアシスタント「Angie」のようなツールは、このギャップを埋めようとしている。チャットで指示するだけで、実用的なレイアウトやフォームを自動生成する。テキスト提案ではなく、実際に動作するアセットを構築する点が従来のAIと異なる。

一方で、スマート冷蔵庫、Apple Watchアプリ、Webサイトに同時にコンテンツを配信する必要があるなら、ヘッドレスのデータエントリーモデルは必須になる。配信先が3つ以上のチャネルに及ぶブランドは、前年比9.5%の収益増加を達成しているとのデータもある。

表示速度、パフォーマンスの現実

表示速度、パフォーマンスの現実

2026年において表示速度は贅沢品ではない。生存のための指標だ。世界のトラフィックの58.67%がモバイルデバイスを経由する中、重いサイトは収益を直接焼き尽くす。

ヘッドレスの圧倒的速度

ヘッドレスシステムは生の速度で容易に優位に立つ。静的サイト生成(SSG)という仕組みを使うからだ。SSGとは、コンテンツのHTMLファイルをあらかじめ生成しておき、CDN(コンテンツ配信ネットワーク。世界中に分散したサーバー拠点から最寄りの場所にデータを届ける仕組み)に保存する手法である。ユーザーがアクセスした瞬間にデータベースへ問い合わせる必要がないため、Next.jsで構築されたサイトは頻繁にLighthouseの満点を叩き出す。

WordPressが抱えるボトルネック

現在、WordPressサイトでGoogleのCore Web Vitals(コアウェブバイタル。ページ体験を測る3つの指標)の全項目を通過しているのは、わずか40.5%だ。PHP処理への依存度の高さと最適化されていないプラグインが深刻なボトルネックを生み出している。参考までに、Next.jsサイトの合格率は約55%に達する。

ただし、WordPressで速度を諦める必要はない。構築方法を変えれば良い。エッジキャッシュの導入、条件付きアセットローディング(必要なときにだけスクリプトを読み込む手法)、画像の自動圧縮、Redisを使ったデータベースクエリのオフロードを徹底する。速度向上は直接売上に跳ね返る。モバイルでわずか0.1秒の改善が小売のコンバージョン率を8.4%押し上げるというデータもある。

セキュリティと保守の実態

セキュリティと保守の実態

セキュリティは従来型CMSエコシステムに突き刺さる最大の棘だ。Elementor Blogの記事が引用する統計は痛烈である。CMS系Webサイトへの攻撃成功事例のうち、実に94%がWordPressを標的にしている。

WordPressの広大な攻撃対象

この数字の理由は明確だ。データベース、ログイン画面(wp-admin)、公開Webサイトがすべて同じサーバーIPアドレスを共有している。攻撃者が古いスライダープラグインの脆弱性を一つ見つければ、データベース全体へのアクセスを奪取できる。攻撃対象領域が極めて広いのだ。

ヘッドレスの構造的安全性

ヘッドレスアーキテクチャはこの攻撃対象領域を劇的に縮小する。フロントエンドはバックエンドから完全に切り離されているため、公開Webサイトにデータベースが接続されていない。ハッカーは静的HTMLファイルにSQLインジェクションを仕掛けることはできない。

もちろん、モノリシックシステムの防御は不可能ではない。共有ホスティングを避け、Cloudflare経由でWAF(Webアプリケーションファイアウォール)を導入し、使っていないプラグインは無効化ではなく即座に削除する。管理ロールには二要素認証を強制し、デフォルトのログインURLを変更する。こうした基本的な対策を徹底するだけでもリスクは大幅に下げられる。

コストの真実、初期費用と総所有コスト

コストの真実、初期費用と総所有コスト

初期構築費用は総所有コスト(TCO)の一部に過ぎない。多くの制作会社がパフォーマンスだけを謳い文句にヘッドレスを販売するが、クライアントに毎月のSaaS料金が重くのしかかる。

ヘッドレスの高い参入障壁

具体的な数字を見てみよう。SANITYのGrowthプランは月額949ドル、ContentfulのTeamティアは月額300ドルからスタートし、エンタープライズプランは通常月額2,000ドルを超える。Strapiのような月額29ドルの選択肢もあるが、Nodeアプリとデータベースを自前でホストする手間が加わる。

WordPressの現実的なコスト

従来型プラットフォームの参入障壁ははるかに低い。中小企業向けの高品質なマネージドWordPressホスティングは、おおむね月額20ドルから115ドルの範囲に収まる。大規模なコンテンツ運用をヘッドレスの数分の一の予算で回せる計算だ。

ただし、WordPressのスケーラビリティは無料ではない。月間100万訪問者を超えると、安価なホスティングは崩壊する。エンタープライズグレードのクラウドインフラ、積極的なキャッシュ階層、高度なセキュリティ設定が必要になる。結局のところ、開発コストもどちらの道でも発生する。ヘッドレスは高給のReact/Vueエンジニアを必要とし、従来型ビルドはPHP/WordPressエキスパートによるテーマロジックの維持や定期的なデータベース最適化を必要とする。

ハイブリッド手法、橋を架ける

ハイブリッド手法、橋を架ける

極端な二択を迫られる必要はない。2026年、最も賢いチームはハイブリッドアプローチを採用している。ページビルダーの視覚的自由を維持しつつ、特定の機能に最新のAPI技術を利用する。

WordPressを純粋なヘッドレスコンテンツリポジトリとして使うことも可能だ。WordPress REST APIとWPGraphQLを使えば、投稿や固定ページをJSONデータとしてクエリし、Next.jsフロントエンドに供給できる。執筆者には使い慣れたGutenbergインターフェースを提供しながら、開発者はモダンなスタックを手に入れられる。

より効率的なのは、モノリシックを維持しながらスピードを上げるアプローチだ。多数のプラグインをつぎはぎする代わりに、ホスティング、ビジュアルビルド、パフォーマンスツールを一つの環境に統合する。AIにワイヤーフレーム生成を任せ、人間は微調整に集中する。主要なマーケティングサイトはモノリシックのまま実行速度を確保し、求人情報や商品カタログといった特定の投稿タイプだけをREST API経由でモバイルアプリにプッシュする。これでデータを閉鎖的なシステムに閉じ込めず、マーケティングチームも視覚編集から締め出されない。

この記事のポイント

  • 従来型WordPressはマーケティングチームの即応性と視覚的編集で圧倒的に優位。
  • ヘッドレスは生の表示速度とセキュリティで勝るが、高いSaaSコストと開発者依存が課題。
  • WordPressの速度課題はエッジキャッシュと条件付きローディングで大幅に改善可能。
  • 3つ以上のチャネルにコンテンツを配信する場合、ヘッドレスのデータエントリーモデルが必須。
  • ハイブリッド手法を用いれば、両者の長所を活かした現実的な落とし所が見えてくる。
React/Next.jsで動的フォームを構築する2つの手法——RHF+ZodとSurveyJSの比較

React/Next.jsで動的フォームを構築する2つの手法——RHF+ZodとSurveyJSの比較

Reactアプリケーションにおいて、フォームの実装は避けて通れない課題だ。ログイン画面のような単純なものから、条件分岐が複雑に絡み合う多ステップの入力フォームまで、その難易度は多岐にわたる。

多くの開発者が「フォームはコンポーネントとして構築すべきだ」という共通のメンタルモデルを持っている。React Hook Form(RHF)とZodを組み合わせる手法は、現在のReactエコシステムにおける標準的な選択肢となっている。

しかし、フォームが「UI」の枠を超え、複雑な「ルールエンジン」へと変貌したとき、このモデルは限界を迎える。本記事では、コンポーネント駆動とスキーマ駆動という2つの異なるアプローチを比較し、プロジェクトに最適な手法を選択するための基準を提示する。

コンポーネント駆動アプローチ:React Hook FormとZodの組み合わせ

コンポーネント駆動アプローチ:React Hook FormとZodの組み合わせ

React Hook Form(RHF)は、非制御コンポーネントを活用して再レンダリングを最小限に抑えるライブラリだ。これにスキーマバリデーションライブラリであるZodを組み合わせることで、型安全で直感的なフォーム実装が可能になる。

Zodによるバリデーションスキーマの定義

コンポーネント駆動開発では、まずZodでデータの形状(Shape)を定義する。単純な必須チェックだけでなく、特定の条件に基づいた相関バリデーションも記述できる。

import { z } from "zod";

export const formSchema = z.object({
  firstName: z.string().min(1, "必須項目です"),
  email: z.string().email("無効なメール形式です"),
  price: z.number().min(0),
  quantity: z.number().min(1),
  taxRate: z.number(),
  hasAccount: z.enum(["Yes", "No"]),
  username: z.string().optional(),
  password: z.string().optional(),
  satisfaction: z.number().min(1).max(5),
  positiveFeedback: z.string().optional(),
  improvementFeedback: z.string().optional(),
}).superRefine((data, ctx) => {
  if (data.hasAccount === "Yes") {
    if (!data.username) {
      ctx.addIssue({ code: "custom", path: ["username"], message: "必須項目です" });
    }
    if (!data.password || data.password.length < 6) {
      ctx.addIssue({ code: "custom", path: ["password"], message: "6文字以上必要です" });
    }
  }
});

export type FormData = z.infer<typeof formSchema>;

このコードでは、`superRefine` を使用して「アカウントあり(Yes)」の場合にのみユーザー名とパスワードを必須にするロジックを実装している。Zodのスキーマはデータの構造を定義するものであり、どのフィールドがどのタイミングで表示されるかといった「表示ロジック」までは関与しない。

RHFによるフォームの実装と課題

RHFを用いた実装では、フォームの表示状態やステップの管理をReactの `useState` や `useWatch` で行う。

const { register, control, handleSubmit } = useForm<FormData>({
  resolver: zodResolver(formSchema),
});

const hasAccount = useWatch({ control, name: "hasAccount" });
const price = useWatch({ control, name: "price" });
const quantity = useWatch({ control, name: "quantity" });

const subtotal = useMemo(() => (price ?? 0) * (quantity ?? 1), [price, quantity]);

この手法の利点は、Reactの標準的な作法に従っているため、学習コストが低く自由度が高い点にある。一方で、条件分岐が増えるにつれてJSX内にインラインの条件式が散在し、ビジネスロジックがUIコードと密結合になるという課題がある。

スキーマ駆動アプローチ:SurveyJSによるデータ中心の実装

スキーマ駆動アプローチ:SurveyJSによるデータ中心の実装

スキーマ駆動アプローチでは、フォームをコンポーネントの集合体ではなく、一つの「データ(JSONスキーマ)」として扱う。SurveyJSはこの手法を代表するライブラリであり、フォームの構造、バリデーション、表示ロジック、計算式をすべてJSON内に集約できる。

JSONスキーマによるロジックの集約

SurveyJSでは、JavaScriptのコードではなく、宣言的なJSONオブジェクトでフォームを定義する。

const surveySchema = {
  pages: [
    {
      name: "order",
      elements: [
        { type: "text", name: "price", inputType: "number" },
        { type: "text", name: "quantity", inputType: "number" },
        {
          type: "expression",
          name: "subtotal",
          expression: "{price} * {quantity}"
        }
      ]
    },
    {
      name: "account",
      elements: [
        { type: "radiogroup", name: "hasAccount", choices: ["Yes", "No"] },
        {
          type: "text",
          name: "username",
          visibleIf: "{hasAccount} = 'Yes'",
          isRequired: true
        }
      ]
    }
  ]
};

ここで注目すべきは `visibleIf` や `expression` というプロパティだ。これらはSurveyJSのランタイムエンジンによって評価され、Reactのステート管理を介さずに動的な表示切り替えや計算結果の表示を可能にする。

Reactコンポーネントの役割の変化

SurveyJSを採用すると、Reactコンポーネントの役割は「スキーマを読み込んで描画するだけ」という極めてシンプルなものになる。

import { Model } from "survey-core";
import { Survey } from "survey-react-ui";

export function SurveyForm() {
  const [model] = useState(() => new Model(surveySchema));

  model.onComplete.add((sender) => {
    console.log(sender.data); // 送信データ
  });

  return <Survey model={model} />;
}

ビジネスロジックがReactから切り離されるため、エンジニア以外の担当者がJSONを書き換えるだけでフォームの挙動を調整できる。これは、要件変更が頻繁に発生するエンタープライズ向けのシステムにおいて、運用上の大きなメリットとなる。

技術的なトレードオフと選択基準

技術的なトレードオフと選択基準

どちらのアプローチが優れているかは、プロジェクトの性質に依存する。ここでは、開発効率と保守性の観点から両者を比較する。

コンポーネント駆動(RHF+Zod)が適しているケース

RHF+Zodのスタックは、フォームが単純なCRUD(作成・読み取り・更新・削除)操作に限定されている場合に最適だ。

  • UIの微調整や独自のアニメーションを多用する場合
  • フォームのステップ数が少なく、条件分岐が単純な場合
  • エンジニアがすべての挙動をコードで管理し、外部からロジックを注入する必要がない場合

このアプローチでは、TypeScriptの恩恵を最大限に受けられる。型定義が明確であるため、大規模なリファクタリングにも強いという特性がある。

スキーマ駆動(SurveyJS)が適しているケース

一方で、SurveyJSのようなスキーマ駆動が威力を発揮するのは、フォーム自体が「ビジネスルール」を体現している場合だ。

  • 法規制や業務フローの変化により、入力項目や条件が頻繁に変わる場合
  • 10ステップを超えるような長大な多ステップフォームを構築する場合
  • フォームの定義をデータベースに保存し、複数のプラットフォーム(Web、モバイルなど)で共有する場合

スキーマ駆動は、ロジックの「可視化」に優れている。JSONを見ればどの項目がどの条件で表示されるかが一目瞭然であり、コードを追う必要がない。

実務における運用上のメリットと分析

実務における運用上のメリットと分析

Web制作会社の視点では、保守コストの削減が最も重要な関心事となる。コンポーネント駆動で構築された複雑なフォームは、半年後の仕様変更時に「どの `useWatch` がどこに影響しているか」を解読する作業から始めなければならない。

スキーマ駆動を採用した場合、ロジックが中央集権的に管理されているため、修正箇所が限定される。また、SurveyJSにはGUIのビジュアルエディタも存在するため、非エンジニアであるディレクターやクライアントが直接フォームを編集し、エンジニアは生成されたJSONを組み込むだけという分業体制も構築可能だ。

ただし、SurveyJSのような重量級のライブラリは、バンドルサイズが増大する傾向にある。パフォーマンスが最優先されるBtoCのランディングページなどでは、RHFを用いた軽量な実装が選好されるだろう。

この記事のポイント

  • RHF+Zodは、UIの自由度が高く、小〜中規模のCRUDフォームに最適である。
  • SurveyJSは、ビジネスロジックをJSONに集約し、複雑な条件分岐を持つフォームの保守性を高める。
  • 「フォームを消したときに失われるものがUIならRHF、ロジックならSurveyJS」という判断基準が有効だ。
  • 運用フェーズでの要件変更の頻度を予測し、適切な抽象化レベルを選択することが重要である。

出典

  • Smashing Magazine “Building Dynamic Forms In React And Next.js”(2026年3月10日)