JavaScriptセキュリティ完全ガイド【2025年最新版】|セキュアコーディングから多層防御の考え方まで徹底解説

「自分の書いたJavaScriptコードが原因で、セキュリティインシデントを引き起こしてしまったらどうしよう」
「利用している外部ライブラリは本当に安全なのだろうか」
Webアプリケーション開発に携わるエンジニアであれば、このような不安を一度は感じたことがあるのではないでしょうか。現代のWebサービスにおいてJavaScriptは中心的な役割を担っており、その影響力は増すばかりです。
しかし、その一方で、JavaScriptに潜む脆弱性を狙ったサイバー攻撃も巧妙化・多様化しており、開発者にはこれまで以上に高度なセキュリティ知識が求められています。
この記事では、JavaScript開発における主要なセキュリティリスクを体系的に整理します。XSS(クロスサイトスクリプティング)やCSRF(クロスサイトリクエストフォージェリ)といった代表的な脆弱性について、その仕組みから具体的な攻撃手法、そして実践的な対策までを深く掘り下げて解説します。
さらに、開発プロセスにすぐに取り入れられる「セキュアコーディング」の原則や、アプリケーションをより堅牢にするための多層防御の考え方も紹介します。本記事を読み終える頃には、あなたはセキュリティに対する漠然とした不安を解消し、自信を持って安全なコードを書くための確かな知識を身につけているはずです。
なぜ今、JavaScriptのセキュリティが重要なのか?開発者が知るべき現状

現代のWebアプリケーションにおいて、JavaScriptの役割は単なるアニメーションや動的な表現に留まりません。
シングルページアプリケーション(SPA)の普及により、画面遷移やデータ処理の多くがユーザーのブラウザ上(クライアントサイド)で実行されるようになりました。
これにより、アプリケーションの応答性は飛躍的に向上しましたが、同時にクライアントサイドで扱うデータの重要性も増し、セキュリティリスクは格段に高まっています。
実際に、外部のJavaScriptライブラリの脆弱性を突かれた大規模な情報漏洩事件も発生しています。例えば、2018年に発生したBritish Airwaysの事例では、改ざんされた外部ライブラリ経由で約38万件ものクレジットカード情報が盗まれました。
これは、npmなどで手軽に導入できるサードパーティのライブラリが、知らず知らずのうちにシステム全体のアキレス腱になり得る「サプライチェーンリスク」の脅威を示す典型例です。
もはや、JavaScriptのセキュリティ対策は他人事ではなく、すべてのWeb開発者が当事者意識を持って取り組むべき喫緊の課題といえるでしょう。
【全体像】JavaScriptに潜む代表的な脆弱とそのリスク

JavaScript開発において特に注意すべき脆弱性は多岐にわたります。ここでは、まず代表的な脆弱性を網羅的に紹介し、それぞれがどのような攻撃を可能にし、ビジネスにどのようなリスクをもたらすのか、その全体像を掴んでいきましょう。
XSSやCSRFといった古典的な脅威に加え、近年のWeb開発環境の変化に伴い注目されるようになった新たな脅威についても触れていきます。
① クロスサイトスクリプティング(XSS)- 最も警戒すべき脅威
XSS(クロスサイトスクリプティング)は、攻撃者がWebアプリケーションの脆弱性を利用して悪意のあるスクリプトを注入し、他のユーザーのブラウザ上で実行させる攻撃です。
これにより、ユーザーのCookie情報(セッションIDなど)の窃取、個人情報の漏洩、Webサイトの改ざんといった深刻な被害が発生する可能性があります。
XSSは、その手口によって大きく3つの種類に分類されます。
特にDOMベースXSSは、SPAのようにクライアントサイドでDOMを動的に書き換える現代的なアプリケーションで問題になりやすい脆弱性です。
例えば、以下のようなコードはDOMベースXSSの脆弱性を持ちます。
// URLからパラメータを取得
const urlParams = new URLSearchParams(window.location.search);
const name = urlParams.get('name');
// 危険なinnerHTMLを使用してDOMに挿入
document.getElementById('greeting').innerHTML = 'Hello, ' + name;
このコードは、URLのname
パラメータをエスケープせずにinnerHTML
で画面に表示しています。
もし攻撃者が http://example.com/?name=<img src=x on-error=alert(1)>
のようなURLをユーザーにクリックさせると、ユーザーのブラウザ上で意図しないスクリプトが実行されてしまいます。
さらに、攻撃者はエンコードを駆使するなどして単純なXSSフィルターをバイパスしようと試みるため、対策は一筋縄ではいきません。
② クロスサイトリクエストフォージェリ(CSRF)- 意図しないリクエストの強制
CSRF(クロスサイトリクエストフォージェリ)は、ユーザーがログインしているWebサービスに対し、そのユーザーの意図しないリクエストを強制的に送信させる攻撃です。
「リクエスト強要」とも呼ばれ、ユーザーが気づかないうちに投稿の削除、パスワードの変更、商品の購入、不正な送金といった操作を行わせることが可能です。
攻撃者は、罠を仕掛けたWebサイトに以下のようなコードを埋め込みます。
ユーザーがそのサイトを閲覧すると、ブラウザは自動的にターゲットのWebサイト(例:http://example.com
)に対してリクエストを送信してしまいます。
もしユーザーがexample.com
にログイン済みであれば、そのリクエストは正規のユーザーによる操作として処理されてしまいます。
<!-- ユーザーがページを開くと自動でフォームが送信される -->
<form action="http://example.com/transfer" method="POST" name="csrf_form">
<input type="hidden" name="to_account" value="attacker_account">
<input type="hidden" name="amount" value="100000">
</form>
<script>document.csrf_form.submit();</script>
この攻撃が成立するのは、ブラウザがリクエストを送信する際に、そのドメインに紐づくCookie(セッション情報など)を自動的に付与してしまう仕様に起因します。
③ サプライチェーン攻撃 - 脆弱なライブラリが招くリスク
現代のWeb開発において、npmなどを通じて外部のライブラリやフレームワークを利用することは一般的です。
これにより開発効率は飛躍的に向上しますが、一方で新たなリスクも生まれています。
それが「ソフトウェアサプライチェーン攻撃」です。
これは、多くの開発者が利用するライブラリ自体に悪意のあるコードを仕込んだり、ライブラリの脆弱性を悪用したりすることで、そのライブラリを利用するすべてのアプリケーションを標的とする攻撃手法です。
ECサイトを標的とし、決済ページで入力されたクレジットカード情報を盗む攻撃を繰り返す「Magecart」グループはその典型例です。
彼らは、サイトが利用しているサードパーティのJavaScriptライブラリを改ざんすることで、広範囲にわたる情報漏洩を引き起こしました。
このように、自作のコードが安全でも、依存しているライブラリの一つに問題があれば、アプリケーション全体が危険に晒されます。
そのため、依存関係にあるライブラリの脆弱性を適切に管理することが極めて重要です。
④ 新たな脅威 - Prototype Pollution, ReDoS, Clickjackingなど
XSSやCSRFといった既知の脅威に加え、開発者は常に新しい攻撃手法にも注意を払う必要があります。
ここでは、特に近年注目されている3つの脅威について簡潔に紹介します。
これらの攻撃は、従来の対策だけでは防ぎきれない場合があり、JavaScriptの言語仕様やブラウザの挙動に対する深い理解が求められます。
常に最新の脆弱性情報を収集し、知識をアップデートし続ける姿勢が不可欠です。
【実践対策】明日から使える!セキュアコーディング 5つの鉄則

脆弱性の仕組みを理解したところで、次はそのリスクを未然に防ぐための具体的なコーディング手法を学びましょう。
ここでは、日々の開発業務にすぐに取り入れられる、特に重要な5つの「セキュアコーディングの鉄則」を紹介します。これらの原則を意識するだけで、あなたの書くコードは格段に安全になります。
鉄則1:入力値は無害化する(サニタイズ・エスケープ)
セキュリティの基本原則は「すべての入力は信頼しない」ということです。
ユーザーからの入力値はもちろん、APIから受け取ったデータやURLのパラメータなど、外部から渡される値はすべて悪意のあるコードを含んでいる可能性があると考えるべきです。
XSS攻撃を防ぐ最も基本的かつ重要な対策が、出力時の「エスケープ処理」と入力時の「サニタイズ」です。
- エスケープ処理: HTML上で特別な意味を持つ文字を、無害な文字列(HTMLエンティティ)に置き換える処理です。
<
を<
に>
を>
に&
を&
に"
を"
に'
を'
に
- サニタイズ: 入力値から悪意のあるコードや不要なタグそのものを除去する処理です。
これらの処理を自前で実装するのは非常に困難で、漏れが生じやすいため、実績のあるライブラリを利用することを強く推奨します。
例えば、クライアントサイドでのHTMLサニタイズには「DOMPurify」が広く利用されています。
鉄則2:安全なAPI・DOM操作を徹底する(textContent
の活用)
DOMベースXSSの多くは、文字列をHTMLとして解釈・実行してしまう危険なDOM操作が原因で発生します。
特にelement.innerHTML
は、渡された文字列をHTMLとしてパースするため、スクリプトを容易に実行できてしまい非常に危険です。
動的にテキストを画面に表示する際は、原則としてelement.textContent
を使用するべきです。textContent
は、渡された文字列を単なるテキストとして扱うため、HTMLタグが含まれていても解釈・実行されることはありません。
同様に、文字列をJavaScriptコードとして実行するeval()
関数の使用は絶対に避けるべきです。
JSON形式の文字列をパースする場合は、必ずJSON.parse()
を使用してください。
ReactのdangerouslySetInnerHTML
やVue.jsのv-html
のように、フレームワークが提供する機能にも同様のリスクが潜んでいるため、使用する際はその危険性を十分に理解し、必ずサニタイズ処理と組み合わせて利用する必要があります。
鉄則3:機密情報をフロントエンドに保存しない
APIキー、認証トークン、パスワードといった機密情報をJavaScriptのコード内に直接書き込んだり(ハードコーディング)、ブラウザのlocalStorage
やsessionStorage
に保存したりすることは絶対に避けてください。
フロントエンドのコードやストレージは、ブラウザの開発者ツールを使えば誰でも容易に内容を確認できてしまうため、機密情報を置く場所として全く安全ではありません。
これらの情報は、必ずサーバーサイドで環境変数などを用いて安全に管理し、クライアントサイドには渡さない設計にすることが基本です。
認証状態を管理する必要がある場合でも、セッションIDのような直接的な意味を持たない情報を、後述するHttpOnly
属性を付けたCookieで管理するなど、漏洩時のリスクを最小限に抑える工夫が求められます。
鉄則4:依存関係を定期的にチェックする(npm audit
)
サプライチェーン攻撃のリスクに対抗するためには、自身が利用しているライブラリやフレームワーク(依存関係)に既知の脆弱性がないかを継続的に監視することが不可欠です。
幸い、npmやyarnといったパッケージマネージャには、プロジェクトの依存関係をスキャンし、脆弱性を報告してくれる便利な機能が組み込まれています。
ターミナルで以下のコマンドを実行するだけで、簡単に脆弱性チェックを行えます。
- npmの場合:
npm audit
- yarnの場合:
yarn audit
このコマンドは、脆弱性が発見されたパッケージ名、脆弱性の深刻度、影響を受けるバージョン範囲などを報告してくれます。
多くの場合、npm audit fix
コマンドで自動的に安全なバージョンに更新することも可能です。
この監査プロセスをCI/CDパイプラインに組み込むことで、脆弱なコードが本番環境にデプロイされるのを自動的に防ぐことができます。
【多層防御】アプリケーションをさらに堅牢にする追加施策

セキュアコーディングは個々の開発者が実践すべき重要な対策ですが、それだけでは万全とは言えません。
アプリケーション全体を保護するためには、ブラウザが提供するセキュリティ機能を活用し、複数の防御壁を築く「多層防御」の考え方が重要になります。
ここでは、主にHTTPヘッダーをサーバーから送信することで実現できる、より強力な追加施策を紹介します。
Content Security Policy (CSP) でスクリプト実行を制御する
CSPは、XSS攻撃に対する非常に強力な防御メカニズムです。
これは、Webページが信頼できるリソース(スクリプト、スタイルシート、画像など)をどこから読み込んで良いかを、HTTPレスポンスヘッダーで明示的に宣言する仕組みです。
ブラウザは、このポリシーに違反するリソースの読み込みや実行をブロックします。
例えば、以下のようなCSPヘッダーを設定すると、スクリプトは自ドメインとhttps://apis.google.com
からのみ読み込みが許可されます。
これにより、たとえXSS脆弱性によって不正な<script>
タグが注入されても、その実行を未然に防ぐことができます。
Content-Security-Policy: script-src 'self' https://apis.google.com;
さらに、インラインスクリプトの実行を原則禁止し、nonce
(一度だけ使えるランダムな値)やhash
を用いて例外的に許可する「Strict CSP」を導入することで、セキュリティレベルをより一層高めることが可能です。
CSPの設定は複雑になりがちですが、CSP Evaluatorのようなツールを使えば、設定内容の妥当性を簡単にチェックできます。
Subresource Integrity (SRI) でCDNの改ざんを防ぐ
jQueryやBootstrapなどのライブラリをCDN(コンテンツデリバリーネットワーク)から読み込むことは、パフォーマンス向上の観点から広く行われています。
しかし、もしCDNがサイバー攻撃を受け、配信されているライブラリファイルが悪意のあるコードに改ざんされた場合、そのライブラリを読み込んでいる全てのWebサイトが影響を受けてしまいます。
このリスクを防ぐのがSRI(サブリソース完全性)です。<script>
タグや<link>
タグにintegrity
属性を追加し、リソースファイルのハッシュ値を指定しておくだけで、ブラウザがファイルをダウンロードした際にその内容が期待通り(改ざんされていない)かを確認してくれます。
もしハッシュ値が一致しない場合、ブラウザはそのリソースの読み込みをブロックします。
<script
src="https://code.jquery.com/jquery-3.6.0.min.js"
integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
crossorigin="anonymous"
></script>
integrity
属性の値は[ハッシュアルゴリズム]-[Base64エンコードされたハッシュ値]
という形式で記述します。
ハッシュ値の生成には、SRI Hash Generatorなどのオンラインツールが便利です。
HttpOnly属性でCookieの盗難を防止する
XSS攻撃の主な目的の一つに、ユーザーのセッションIDなどが保存されたCookieを盗み出し、そのユーザーになりすます「セッションハイジャック」があります。
このリスクを軽減する非常に効果的な対策が、サーバーがCookieを発行する際にHttpOnly
属性を付与することです。
HttpOnly
属性が設定されたCookieは、JavaScriptのdocument.cookie
からアクセスすることができなくなります。
そのため、たとえWebサイトにXSS脆弱性が存在し、攻撃者が任意のスクリプトを実行できたとしても、Cookieを盗み出すことは困難になります。
認証情報など、サーバーとの通信にのみ必要なCookieには、必ずこの属性を設定するべきです。
Set-Cookie: session_id=...; HttpOnly; Secure
【独自解説】WAFやCSPの限界とクライアントサイドセキュリティの重要性

これまで様々な対策を紹介してきましたが、WAF(Web Application Firewall)やCSPといった従来のセキュリティ対策だけでは、巧妙化するクライアントサイドの脅威を完全に防ぐことは困難になっています。
WAFは主にサーバーサイドへの攻撃を防ぐものであり、ユーザーのブラウザ上で実行されるスクリプトの挙動までは監視できません。
また、CSPは強力ですが、許可したドメインから配信されるスクリプト自体の安全性を保証するものではなく、設定が複雑で運用が難しいという課題もあります。
特に、現代のWebサイトが依存している多数のサードパーティスクリプト(広告タグ、解析ツール、各種ウィジェットなど)は、セキュリティ上の大きなブラックボックスとなっています。
これらのスクリプトは企業の管理外で動作し、脆弱性があれば情報漏洩やサイト改ざんの侵入口となり得ます。
この課題を解決するためには、クライアントサイドで動作するスクリプトそのものを直接「可視化」し、「制御」する新たなアプローチが不可欠です。
Spider AF SiteScanによる外部スクリプトの可視化と制御

弊社が提供する「Spider AF SiteScan」は、まさにこのクライアントサイドのセキュリティ課題を解決するために開発されたソリューションです。
WAFやCSPでは手の届かなかった領域をカバーし、可視化・制御・対応の3つの軸で包括的なサポートを提供します。
Spider AF SiteScanを導入することで、企業はこれまで管理が難しかったサードパーティスクリプトのリスクをコントロール下に置くことができます。
まとめ:セキュリティを強みとし、信頼されるエンジニアへ
本記事では、JavaScriptに潜む主要な脆弱性から、セキュアコーディングの実践、そして多層防御の考え方まで、幅広く解説しました。
- 脆弱性の理解: XSS、CSRF、サプライチェーン攻撃などの仕組みとリスクを把握することが第一歩です。
- セキュアコーディングの実践: 「入力値の無害化」「安全なAPIの使用」「機密情報をフロントに置かない」「依存関係のチェック」を日々の開発で徹底しましょう。
- 多層防御の導入: CSP、SRI、HttpOnly属性といったブラウザのセキュリティ機能を活用し、防御壁を何重にも構築することが重要です。
- 新たな対策の検討: WAFやCSPの限界を認識し、「Spider AF SiteScan」のようなクライアントサイドを直接保護するソリューションの導入も視野に入れましょう。
JavaScriptのセキュリティ対策は、一度行えば終わりというものではありません。新たな脅威は次々と現れ、常に知識をアップデートし続ける必要があります。
しかし、この継続的な学習と実践こそが、あなたを単なる「コードが書けるエンジニア」から「ユーザーとビジネスを守れる、信頼されるエンジニア」へと成長させる原動力になります。
本記事が、そのための確かな一歩となることを願っています。