version skewは、ソフトウェアシステムの2つのコンポーネントが通信する際に、同じバージョンで動作していないときに発生します。多くの場合、これは問題ないのですが、予測しにくくデバッグが難しい問題を引き起こすことがあります。

例えば、あなたのアプリにフォームがあるとします。ある日、メールアドレスのフィールド名をスペルミスしていたことに気づきます。それほど大きな問題ではなく、バックエンド側でそのフィールドを読み取るコードも同じスペルミスをしています。しかし、あなたはバックエンドとフロントエンドの両方でスペルを修正することに決めました。これでバージョンの不一致の可能性が出てきます。もし、ユーザーが変更前にフォームを読み込んでいて、その後、変更がデプロイされた後にフォームを送信すると、エラーが発生します。なぜなら、メールフィールドが認識されなくなるからです(バックエンドは新しいスペルを期待し、フロントエンドは古い名前を送信するため)。

Skew Protection

Next.jsはバージョンスキューのほとんどのインスタンスを自動的に軽減し、検出された場合は自動的にアプリケーションをリロードして新しいアセットを取得する。たとえば、deploymentIdに不一致がある場合、ページ間の遷移は、プリフェッチされた値を使用するのではなく、ハードナビゲーションを実行します。

さらに、VercelのSkew Protectionを使うといい。アプリケーションにデプロイIDをバインドして、リクエストにタグを付ける。しかし、これはダウングレード攻撃のリスクをもたらすため、クライアントからのリクエストが解決されないように個別で設定することも可能


TypeScriptでフロントエンドとバックエンドで型共有をすると、型エラーが起きないため非互換変更がカジュアルに行われやすく、version skewも発生しやすくなりそう

x.com/yuta0801_/status/1897284547433390231