WebアプリのSession管理について

セッションIDだけでなくセッションデータ自体も暗号化してCookieに入れて管理したいと考えています。

まず思いつく疑問としてどのくらい容量が使えるのかというのがあります。
たとえばテキストエリアフォームの2000文字のテキストを10個くらい入れても問題ないのでしょうか。
またセキュリティ上注意する点などありましたら教えてください。

Cookieにセッションデータを入れるのがなんとなく好まれてない雰囲気があると思うのでいろいろ問題がありそうな気もするのですが

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/07/10 16:31:40
  • 終了:2012/07/11 11:05:43

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4439ベストアンサー獲得回数18232012/07/10 17:41:11

ポイント85pt

http://www.ietf.org/rfc/rfc2965.txt

HTTP State Management Mechanism
  ...
5. IMPLEMENTATION CONSIDERATIONS
  ...
5.3 Implementation Limits
  ...
* at least 4096 bytes per cookie (as measured by the characters
that comprise the cookie non-terminal in the syntax description
of the Set-Cookie2 header, and as received in the Set-Cookie2
header)

* at least 20 cookies per unique host or domain name

RFC 2965 では、最低でも 4096byte のデータを扱えるようにしましょう、となってます。
あと、ひとつのドメインあたり、20個までは扱えるように、と。
# RFC で決められているのは、最大サイズではなく、最小サイズです

じゃあ、実際にどこまで使えるんでしょう。
ちょっと古いですが、調べた人がいます。
http://www.upken.jp/kb/yONABCJYezwRUFvgceUEifjBphmQ.html
http://www.teria.com/~koseki/memo/cookie/cookie_4k.html

多少、ブレはあっても、4Kbyte を遥かに超えたサイズは、扱えないと思っておいたほうが良さそうです。

たとえばテキストエリアフォームの2000文字のテキストを10個くらい入れても問題ないのでしょうか。

なので、2000文字(4000byte)のテキストを一つのクッキーとして扱えば、一応、10個くらいまでは扱えそうです。
でも、暗号化するんですよね。
よく使われる暗号化アルゴリズムをバイナリになっちゃうので、テキスト形式にエンコード(Base64 とか)する必要がありますよね。
そうすると、元のデータよりも少しサイズが増えるので、1500byte くらいしか扱えないですね。

クライアントを選びますが、限られた範囲であれば、HTML5 の Web Storage を使う手もありますね。
ブラウザによりますが、数メガバイトまでは扱えます。

またセキュリティ上注意する点などありましたら教えてください。

鍵は絶対に、Cookie に持たないこと。
解読されちゃう危険があります。
ということは、javascript では、Cookie の値を使えない(復号できないから)、ということになります。

鍵がなくても、暗号強度が弱いアルゴリズムを使ってると、解読されちゃうリスクが大きくなります。


セッションデータをクライアントに持ちたい、という要求の背景が分からないまま書いてますが、サーバサイドで管理するよりは、確実にセキュリティ上のリスクが増えることを認識しておいた方が良いと思います。

他1件のコメントを見る
id:a-kuma3

Cookie って、URL が該当すれば、サーバサイドの処理で使わなくても、リクエストに乗っかって飛んでいくので、負荷の軽減にはならないです(負荷と言っても、微々たるものですが)。
毎回、サーバとクライアントの間を行き来するなら、短いセッションキーをやり取りした方が、ネットワークの負荷は軽くて済みます(特に、回線が細かった昔では)。

ただ、全部サーバサイドに持っておく必要はないよね、って発想は誰でも持っていたはず(特に、セッションをまたいで永続化したいデータ)で、だからこそ、HTML5 で Web Storage が定められたんだと思います。

2012/07/10 22:20:57
id:timestep

WebStorageはネットワーク負荷も軽いみたいですね。こちらも検討したいと思います。ありがとうございました。

2012/07/11 00:28:42

その他の回答(2件)

id:techmedia-think No.1

techmedia-think回答回数46ベストアンサー獲得回数132012/07/10 16:55:07

ポイント5pt

Cookieの最大サイズは確か4KBまでだったと思うので、それを超えるデータは保存できないかと思います。

id:a-kuma3 No.2

a-kuma3回答回数4439ベストアンサー獲得回数18232012/07/10 17:41:11ここでベストアンサー

ポイント85pt

http://www.ietf.org/rfc/rfc2965.txt

HTTP State Management Mechanism
  ...
5. IMPLEMENTATION CONSIDERATIONS
  ...
5.3 Implementation Limits
  ...
* at least 4096 bytes per cookie (as measured by the characters
that comprise the cookie non-terminal in the syntax description
of the Set-Cookie2 header, and as received in the Set-Cookie2
header)

* at least 20 cookies per unique host or domain name

RFC 2965 では、最低でも 4096byte のデータを扱えるようにしましょう、となってます。
あと、ひとつのドメインあたり、20個までは扱えるように、と。
# RFC で決められているのは、最大サイズではなく、最小サイズです

じゃあ、実際にどこまで使えるんでしょう。
ちょっと古いですが、調べた人がいます。
http://www.upken.jp/kb/yONABCJYezwRUFvgceUEifjBphmQ.html
http://www.teria.com/~koseki/memo/cookie/cookie_4k.html

多少、ブレはあっても、4Kbyte を遥かに超えたサイズは、扱えないと思っておいたほうが良さそうです。

たとえばテキストエリアフォームの2000文字のテキストを10個くらい入れても問題ないのでしょうか。

なので、2000文字(4000byte)のテキストを一つのクッキーとして扱えば、一応、10個くらいまでは扱えそうです。
でも、暗号化するんですよね。
よく使われる暗号化アルゴリズムをバイナリになっちゃうので、テキスト形式にエンコード(Base64 とか)する必要がありますよね。
そうすると、元のデータよりも少しサイズが増えるので、1500byte くらいしか扱えないですね。

クライアントを選びますが、限られた範囲であれば、HTML5 の Web Storage を使う手もありますね。
ブラウザによりますが、数メガバイトまでは扱えます。

またセキュリティ上注意する点などありましたら教えてください。

鍵は絶対に、Cookie に持たないこと。
解読されちゃう危険があります。
ということは、javascript では、Cookie の値を使えない(復号できないから)、ということになります。

鍵がなくても、暗号強度が弱いアルゴリズムを使ってると、解読されちゃうリスクが大きくなります。


セッションデータをクライアントに持ちたい、という要求の背景が分からないまま書いてますが、サーバサイドで管理するよりは、確実にセキュリティ上のリスクが増えることを認識しておいた方が良いと思います。

他1件のコメントを見る
id:a-kuma3

Cookie って、URL が該当すれば、サーバサイドの処理で使わなくても、リクエストに乗っかって飛んでいくので、負荷の軽減にはならないです(負荷と言っても、微々たるものですが)。
毎回、サーバとクライアントの間を行き来するなら、短いセッションキーをやり取りした方が、ネットワークの負荷は軽くて済みます(特に、回線が細かった昔では)。

ただ、全部サーバサイドに持っておく必要はないよね、って発想は誰でも持っていたはず(特に、セッションをまたいで永続化したいデータ)で、だからこそ、HTML5 で Web Storage が定められたんだと思います。

2012/07/10 22:20:57
id:timestep

WebStorageはネットワーク負荷も軽いみたいですね。こちらも検討したいと思います。ありがとうございました。

2012/07/11 00:28:42
id:taroe No.3

taroe回答回数1099ベストアンサー獲得回数1322012/07/10 20:18:37

ポイント10pt

Internet Explorer で cookie の数とサイズの制限
Microsoft Internet Explorer には、最低限の制限を推奨以下の RFC 2109 に準拠しています。
少なくとも 300 のクッキー
(端末以外の Set-cookie ヘッダーの構文の説明での cookie を構成する文字のサイズを測定すると)、cookie ごとに 4,096 バイト以上
少なくとも 20 の cookie ごと一意のホストまたはドメイン名
注これらの推奨最小制限セクション 6.3 では、「実装制限」、RFC 2109 でが表示されます。詳細については、「関連情報」セクションを参照してください。

http://support.microsoft.com/kb/306070/ja



Cookieでセッションデータの中身自体を持つのは
そのデータサイズによりますが、
クッキーの場合、確かに仕様では4KB程度はいけますが
今はどうかは知りませんが、大きなサイズので安定性が良くないと思います。

何か問題が起こった場合は、環境依存、端末依存になり原因追及が困難です。
あまり多くの人がやらないことをするのは、リスクが高すぎると思います。

>WebフレームワークでもCookieでの管理がデフォルト設定

セッションIDをクッキーで保存するという意味だと思いますし
現状、多くのWEBシステムはこれが標準です。

id:timestep

>セッションIDをクッキーで保存するという意味だと思いますし

いいえ。SessionデータをCookieに格納するような設計になっているWebフレームワークがあります。例えばPHPならCodeIgniter, Pythonならflaskなどがそうです

2012/07/11 00:18:06

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません