facebookでthird party cookieが書き込めない問題について

主にsafariに限ったことと言っても過言ではないのですが、facebookに埋め込むアプリを作成した場合、cookieが書き込めない場合があります。

それは、主流のブラウザの中でsafariだけ、デフォルトでcookieのセキュリティが他ブラウザよりも厳しい設定がされているからです。

そもそもなんでcookieが書き込めないのか

safariブラウザのcookieの設定は、third party cookieを書き込めないような設定になっています。

f:id:w6500:20121003124642p:plain

では、third party cookieの書き込みとはどういうことか、簡単に図にまとめてみました。

f:id:w6500:20121003194317p:plain

例1の方法は通常の場合です。
ブラウザからアクセスしているドメインと同じドメインのcookieを書き込んでいるのでなんの問題もありません。

例2の方法はfacebookのcanvasアプリの場合です。
ブラウザからアクセスしているドメインはfacebookのドメインなのに対し、書き込もうとしているcookieのドメインは、iframeでアクセスしているドメインのため、これはthird partyからのcookieの書き込み、ということになります。

safariブラウザはこれを制限しているのです。

cookieが書き込めないと

ガラケーと同じ問題が起こります。
cookieの書き込みができないため、cookieによるsessionIDのやり取りができず、sessionを使ったwebアプリケーションの構築ができません。

そのための解決策として最も簡単なのは、ガラケーと同じでsessionIDをURLのリクエストパラメータに含めてしまうことです。
ただ、これはセキュリティの観点からあまり良い方法とは言えません。

抜け道

なんとかできないかと抜け道を探っていたところ、一つだけ方法がありました。

cookieの書き込みはできないが、cookieの送信はできる”

上記の仕様をついて、canvasアプリでsessionを使用する場合、まず初めにfacebookの外で自分のドメインにアクセスさせ、sessionIDをcookieに書き込み、facebookに戻ってきます。

すると、facebookに戻ってきた時点で、すでにcookieにはsessionIDが書き込まれているため、そのcookieが送信されsessionを扱うことができるようになるのです。

f:id:w6500:20121003202034p:plain

ただ、この方法もいつブラウザ側の仕様変更で通用しなくなるかわかりません。
誰かなんとかしてほしいです。