6671
バックエンドAPIサーバーと通信するクライアントを、JavaScript&HTMLで作成しようとしています。

バックエンドで「正しいクライアントからのリクエストか否か」を調べるためには、クライアントに専用の秘密の文字列を埋め込んでおき、それをリクエストパラメータまたはヘッダに含めて送信するのが一般的なのではないかと思います。

しかし、JavaScript&HTMLでその手法を採用した場合、ユーザは秘密の文字列に容易にアクセスすることができてしまいます。  
それにより、(知識のあるユーザであれば)バックエンドAPIを利用した野良サイトを作るなどして自由にAPIを使うことが可能です。

JavaScript&HTMLのクライアントで、「正しいクライアントからのリクエストか否か」を調べるセキュアな方法はありますでしょうか。
CC BY-SA 3.0
2015-02-18T01:10:41.280
6659
2015-02-18T03:45:24.013
205
question
javascript html security
JavaScript&HTMLクライアント利用時の、クライアントの正当性を担保する方法について
ありません。いかなる対策も、改竄をしようとするユーザが解読打破できます。

質問内容からクライアント側がPCであるとします。その環境では、ユーザから隠される情報、ユーザが変更のできない情報はありません。あなたが心血を注ぐことで、ユーザーによるプログラム改竄コストを上げることはできますが、本質的な部分であなたの目的は達成不可能です。

効果的な対策があるとすれは、それはサーバサイドで、クライアントの挙動をチェックをすることでしょう。怪しい挙動・リクエストのパターンを定義し、そのパターンを検知した場合に認証トークンの無効化、もしくは一定時間の
ban とします。
CC BY-SA 3.0
2015-02-18T02:54:14.677
6671
2015-02-18T02:54:14.677
4978
6659
answer
この手の正当性の確保は、どの程度のセキュリティが必要かで対応が異なります。

JavaScritとHTMLでは正規のクライアント上でも改変出来てしまうので、  
補助的には使用しますが、主な対応するのはサーバー側になります。

単にAPIを野良サイトや検索ロボット等からの大量アクセスを制限したいだけなら  
サーバー側でリファラー判別の制限するだけでも十分な効果は期待できます。

リファラー偽装にも対応するなら、追加でセッション情報の判別を仕込んでもいいでしょう。  
一時的に有効になるパスコードにアクセス元IPを紐付けたり回数制限を追加すると更に強化できます。

高度なセキュリティが必要であればSSLやBasic認証等、場合によってはクライアント証明書  
といったものを組み合わせる必要が有ります。  
但し、ユーザー側の「悪意のあるクライアント」を100%防げる方法は存在しません…
CC BY-SA 3.0
2015-02-18T03:45:24.013
6674
2015-02-18T03:45:24.013
5479
6659
answer