この前Cookieを使ったログイン認証を作ってるときにハマった内容。

参考サイト:
http://itpro.nikkeibp.co.jp/article/COLUMN/20080221/294407/


上記のサイトにもあるが、Cookieにはdomain属性とpath属性というのがある。

[domain属性]
ブラウザがクッキーを送信するサーバーのドメイン名。ブラウザがアクセスするURL内のドメイン名がこれに後方一致(一部制限がある)する場合のみクッキーを送信する。後方一致しない場合はブラウザにセットしない。省略した場合は,アクセスしたURLに含まれるホスト名が使用される。
例)
domain属性の値が「hoge.jp」の場合、ドメイン名が「xxx.hoge.jp」のように「hoge.jp」で終わるURLの場合のみ、requestでCookieの情報を送信する

[path属性]
ブラウザがクッキーを送信するサーバーのパス。ブラウザがアクセスするURL内のパスがこれに前方一致する場合のみクッキーを送信する。前方一致しない場合はブラウザにセットしない。省略した場合は,アクセスしたURLに含まれるパスが使用される。
例)
path属性の値が「hoge/login」の場合、パスが「xxx/hoge/login」のように「hoge/login」で終わるURLの場合のみ、requestでCookieの情報を送信する



で、この前ハマったのがdomain属性の方。
環境としては、

 ・ログインはテスト環境で行う
 ・ログイン情報をCookieで持つ
 ・サイト内の各ページへ行く際は、Cookieの情報を使用してログイン認証を行う
 ・テスト環境、ローカル環境どちらも同じ名前のCookieを使用する
 
テスト環境でログインしてCookieにログイン情報が設定されるが、domain属性にサイトのドメイン名の後方部分(仮でaaa.jpとする)が設定されていた。
ローカル環境でテストする時は「localhost」でアクセスするから、domain属性の値と一致せずブラウザがCookieの情報を送ってくれないため、ログイン認証で失敗する。
何故Cookieが送信されないのか分からず、ずっとローカルでログイン出来ないと悩み続けた・・・


そこで見つけた解決方法としては、

 ①ローカルのhostsファイルでループバックアドレス(127.0.0.1)を
  「local.aaa.jp」とかdomain属性の値を含んだ適当なドメイン名を紐付ける
 ②①で紐付けたドメイン名を使用したURLでアクセスする
  (local.aaa.jp:8080/xxx/xxxとか)

こうすればブラウザがCookieの情報を送ってくれて、ログインも成功する。
path属性でも同じことは起こりうるけど、基本的にパスは本番でもローカルでも同じはずだからあまり気にしなくていい。

Cookieの仕様ちゃんと理解してればすぐ解決できたんだけどな~
しばらくモバイルの開発しかやってなかったから、Cookieとか完全に忘れてた・・・
これからどんどんスマフォに移行していく時代の流れだし、使いこなせるようにしとかないと。