iビジネス&テクノロジー このページをアンテナに追加

2007-11-23

[]Googleはもう流行らない? 11:24 Googleはもう流行らない?を含むブックマーク

急増するFacebookのGoogler引き抜き

とにかくFacebookGoogleよりもはるかに「魅力的」らしい

(略)

「金だけの問題じゃない。イノベーションを求めるなら世界で一番ホットなところで働きたいもの。今それがFacebookなんだ。」

OpenSocialの件でも対Facebookで火花を散らしてますが、これはムキになるのも仕方ないですかね。やはりGoogleほどの会社でも、でかくなるとやりにくくなるものなのかな。

[]Rails 2.0の新しいセッション管理-CookieStore 19:30 Rails 2.0の新しいセッション管理-CookieStoreを含むブックマーク

(注)この記事の動作確認環境はRC1です。

以前、Railsデフォルトでtmp/sessionsにセッションファイルを作り続けるため、sessionsフォルダ内のメンテナンスが必要であるという記事を書きました(こちら)。Rails2.0ではデフォルトでCookieStoreという新しいセッション管理機構を用いるため、上記処理の必要がなくなります。

CookieStoreの特徴

  • クッキーで情報を持つため余分なIOがなくなり高速
  • セッションファイルの管理が不要
  • セッションデータが4kを越える場合はCookieOverflowエラー*1

デフォルト設定

environment.rbを確認すると、以下のような記述が追加されています。

  config.action_controller.session = {
    :session_key => '_application_session',
    :secret      => 'some_random_value'
  }

この設定を用いて、railsセッション情報をcookieへ格納します。

セッションデータのcookieへの格納

cookie内で、セッションデータは上記session_keyをキーとして以下のように格納されています。

BAh7BzoJeXNlciIJaG9nZSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6%250ARmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--8fe60b380b7fe7727a5d3eacc284387644631a22

'--'をセパレータとして、左側にセッションデータ、右側にセッションデータを暗号化(というよりハッシュ化)したものがセットされています。つまり左側を(data)、右側を(digest_date)とすると

(data)--(digest_data)

と言うフォーマットで格納されるわけです。

(data)の生成

セパレータ左側のデータは以下のロジックで生成されています。

Base64.encode64(Marshal.dump(session)).chop

データをmarshalしてbase64エンコードしていることが分かります。(data)の暗号化はされていません。

(digest_data)の生成

セパレータ右側のデータは以下のロジックで生成されています。

OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(@digest), key, data)

HMACでハッシュ結果を生成しています。dataはセパレータ左側のデータと同じものです。@digestはデフォルトSHA1が用いられますが、設定により変更できます。例えばSHA256にしたい場合、environment.rb内の設定を以下のようにしてやります。

  config.action_controller.session = {
    :session_key => '_application_session',
    :secret      => 'some_random_value',
    :digest      => 'SHA256'
  }

(data)と(digest_data)

(data)と(digest_data)の内容自体は同じものです。サーバサイドでは(digest_data)をもとにcookieデータの正当性を検証します。secretキーを知らない限り(digest_data)は生成できないので、ユーザによるcookieデータの改竄を防ぐことができます。

運用上の注意

  1. ユーザに見せたくないデータはセッションに格納してはいけません。*2
  2. セッションデータが4kを超えないようにしてください。
  3. (11/28追記)運用環境では:secretの値を変更するなど、秘密鍵の漏洩に注意してください。*3

上記3点にだけ気をつければ、あとは他の格納方法とかわりありません。セッションファイルの管理が不要になると言う大きなメリットがあるため、特段の事情がなければデフォルト設定のままCookieStoreを使用していただいて問題ないでしょう。

なお、第3者へのデータ漏洩を防止するためにはhttpsを用います。これは他の方法でSession管理を行う場合も同様です。CookieStoreを用いるからといって、他の方法と比べて漏洩リスクが格段に高くなるということはありません。*4

[]殺し名の一番手が出てきました 23:45 殺し名の一番手が出てきましたを含むブックマーク

それにしても、223ページ(後書き含む)は短すぎないか。

星噛絶奈ちゃん、今回は差し詰め匂宮というところでしょうか。噛んでるあたり、確信犯的なものを感じます。話自体は読みようによっては戯言より面白いのですが、二番煎じなマイナスポイントは否定できないところでしょう。

それにしても短い、一冊の最後のほうでようやく敵役登場ってどうよ?とはいえ、それほどつまらなかったわけでもありません。優柔不断な主人公とヒロイン達のヌルヌルな掛け合いは、このためにラノベ読んでるだよと思わず叫びたくなって回りを見渡し躊躇するほどの直球勝負な潔さです。いや、ほんと面白いことは面白いんだけどなぁ・・・勿体無い。

*1セッションでサイズの大きいデータを扱いたい場合は、PStoreやActiveRecordStoreなど他の方法を採用する必要があります。

*2暗号化されないセッションデータがcookieに保存されるため。secretキーがあるからといって暗号化されたデータのみを扱っているわけではないことに注意!

*3データベースパスワードと同じくらいの運用をしていただくとよいでしょう。

*4:CookieStoreを使わなくても、session_idはcookieでやりとりされているため。ただし、秘密鍵が明かになるとクッキーが改竄できるので、その点でなりすましのリスクが高まるということは言えるかも知れません。秘密鍵は慎重に管理しましょう。当たり前だけど

irohirokiirohiroki 2007/11/28 12:18 「運用上の注意」に:secretを変更することを加えてはいかがでしょう。
また、digest_dataはチェックサムのようなもので可逆性がありませんから(計算機パワーがいくらあっても)、dataと「内容自体は同じもの」と言ってしまうのは違和感がありますがいかがでしょうか?

bottleneckbottleneck 2007/11/28 14:46 コメントありがとうございます。前者ご指摘反映させていただきました。後者は・・・良い表現が思いつかないのでペンディングで(- -;