改この広告は、90日以上更新していないブログに表示しています。2010-09-18なぜJSONPだとクロスドメイン制約を超えられるのか?なぜ通常のXMLHttpRequestにはクロスドメイン制約があるのに、JSONPではクロスドメインでリクエストを送信できるのか?不思議に感じたので、ちょっと調べてみた。クロスドメイン制約は「ブラウザ上で実行されるJavaScriptは同じドメインにしかリクエストの送信やクッキーの編集を行えない」という制限である。このような制限が必要になるのか。クロスドメイン制約がなかったらどうなるかを思考実験してみよう。ブラウザ上では、いくつものサイトからダウンロードしてきたJavaScriptが同時に実行されることは珍しくない。悪意のあるページにアクセスしてしまい、悪意あるJavaScriptを実行してしまうことも、十分に起こり得る話である。間違えて変なページにアクセスしたら致命的な問題が起きました、ではまずいので、ブラウザではJavaScriptができる事にかなりの制限を与えている。XMLHttpRequestのクロスドメイン制約もこの制限の一つである。XMLHttpRequestは、JavaScriptが自由にHTTP通信を行える非常に強力な機能である。クロスドメイン制約がなく、悪意あるJavaScriptが自由にXMLHttpRequestをいろんなサイトに送る事ができたらどうなるだろうか?例えば、銀行のサイトにログインした状態で、別のタブで悪意のあるサイトにアクセスしたものとする。悪意あるJavaScriptが自由にXMLHttpRequestを送れるとすると、ブラウザから認証クッキーも送られるという仮定の元ではあるが、悪意あるJavaScriptは口座残高の情報などを簡単に取れてしまうし、送金作業なんかもできるかもしれない。ブラウザというのは複数のページの情報を同時にロードしているものなので、サーバー側にある機密情報を守るためにクロスドメイン制約が重要なのである。サーバー側にある、と表現したのは、ブラウザ側(クライアント側)にも機密情報は存在するからだが、そもそも別のタブの内容に関しては、ブラウザにバグがない限り絶対に参照できないようになっている。当たり前の仕様なので特に名前とかはついていない。クロスドメイン制約は、悪意あるサイトにアクセスした際に情報が漏洩することを防ぐためにブラウザが提供する仕組みなのだ。JSONPはなぜクロスドメイン制約を破れるのだろうか。セキュリティ上の問題にならないのか?まず、JSONPが使われる場面について考えてみよう。そもそも、世の中には機密情報とそうでない情報がある。クロスドメイン制約が重要なのは、悪意あるJavaScriptがあなたのブラウザ上で実行され、銀行などのサーバーにアクセスして機密情報を盗み出す事を防ぐためである。クロスドメイン制約のおかげで、悪意のあるJavaScriptが実行されても、機密情報にはアクセスできない。ここでポイントになるのが、JSONPはクロスドメイン制約を回避して通信するためにわざわざサーバー側で対応が必要になるという点である。後述するが、JSONPでまともに機密情報を扱うことは不可能に近い。JSONPのAPIをわざわざ用意するということは、そこで提供される情報は機密情報ではないはずである。「機密情報でなければJSONPで提供してもいい」のだ。逆に、なにも考えずに機密情報をJSONPで提供するようなサイトが出てきてしまうと、それはセキュリティ上の問題になるだろう。それはそのサイトの脆弱性であってブラウザの脆弱性ではない。JSONPのAPIを提供するかどうかはそのサイトが決めるからだ。ここまでを一旦箇条書きでまとめよう。APIをサーバー側でわざわざ用意する」というところが、「この情報は機密情報ではない」と宣言することに相当するわけね。あー、やっとわかってすっきりした。無制限にXMLHttpRequestを使えるとまずいという事はわかったが、クロスドメイン制約は厳しすぎないだろうか。提供するAPIなどは、クロスドメイン制約にしばられずにブラウザ上から利用出来てもいいわけだ。セキュリティのために利便性をかなり落としていると言える。あるサーバーが機密情報を持っているのか、他のサイト上のJavaScriptからAPIを叩いてもいいのかどうかは、当たり前ではあるが、そのサーバー自体が宣言すべきである情報である。「このAPIはどこから使ってもいいです」という宣言がサーバー上のどこかにあれば、そのAPIに対してはどこからアクセスしても大丈夫なはずだ。2が読むAccess-Control-Allow-Originである。2では、クロスドメインなリクエストもとりあえず送信してみて、返ってきたHTTPヘッダにAccess-Control-Allow-Originが含まれているかどうかを見る。含まれており、なおかつ利用可能条件が一致する場合にのみ、JavaSciptは結果を受け取ることができる。2を使うのは、JSONPにはリクエスト元を制限する確実な方法がない読み込んだJavaScriptがブラウザ上で実行されるので、信用できないサイトのJSONPは読み込んではいけないといった問題点があるからである。2を使ったほうが良い。8(こいつだけはちょっと仕様が違うけど)以降で使える。5は福音...2009-09-30Googleのトップページを開くと毎秒100回JavaScriptが実行されるよFirefoxがCPUを常に15%ぐらい食うのが気になっていたので調べて...2009-06-21Firefoxからsshのダイナミック転送を使って非公開サーバへアクセスするsshにはダイナミック転送という機能がある。はてなブログをはじめよう!tkngさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。