スポンサーリンク
ウェブブラウジングの根幹を支える技術に cookie(クッキー) があります。
これはエンジニアのみならずほとんどの人のウェブブラウジングで使われています。
私はこのcookieがどんな物かについて、なんとなくの役割だけは知っていましたが、実際にどのようにやり取りされるかをよく知りませんでした。
しかしとある案件で詳しく知る必要があったので、調べたことをメモしておきたいと思います。
とあるWebサービス上で別サービスのAPIを実行する必要があったのですが、そのときにcookieを使うというオプションが存在しませんでした。
一方、HTTPヘッダを読み込んで使うことはできたので、必然的に自分でcookieを処理する動作を作り込む必要がありました。
その過程で初めてcookieのやり取りの詳細を知りましたので、今回はcurlを使ってそのやり取りを説明したいと思います。
wikipedia様によると、、
HTTP cookie(エイチティーティーピークッキー、単にクッキーとも表記される)は、マジッククッキーの一種であり、RFC 6265などで定義されたHTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。
ユーザ識別やセッション管理を実現する目的などに利用される。
とのことです。
重要なのは HTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル
の部分かと思います。
要するに、本来 ステートレス(状態の概念が存在しない)なHTTP というプロトコルにおいて、 状態を管理する機能を補完するための仕組み ということかと思います。
まずcookieは HTTPのヘッダ でやり取りされます。
実際に google.co.jp
にアクセスしてみます。
# ヘッダだけ表示する
curl -Ss -o /dev/null -D - https://www.google.co.jp
すると、ヘッダは以下のような内容が返ってきます。
HTTP/2 200
date: Mon, 27 May 2019 23:45:29 GMT
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=Shift_JIS
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
set-cookie: 1P_JAR=2019-05-27-23; expires=Wed, 26-Jun-2019 23:45:29 GMT; path=/; domain=.google.co.jp
set-cookie: NID=184=rA7ccN1BnJ2bixU7PmVQ8OUKzSbz9GHvvXa0JdMH2Uh0FHA3gCOu9sDg3jy9QzRgAlrTN9fsaK3QABOgjY7cGbJC7DEG5wKp3D7wYb4g7ftT9QJ_qleP9acX_Z4KoBhkXKF1LGmWALFgg--SEYBwYCbCL-7KgWDpdrEdb1TFqss; expires=Tue, 26-Nov-2019 23:45:29 GMT; path=/; domain=.google.co.jp; HttpOnly
alt-svc: quic=":443"; ma=2592000; v="46,44,43,39"
accept-ranges: none
vary: Accept-Encoding
この中の
set-cookie: 1P_JAR=2019-05-27-23; expires=Wed, 26-Jun-2019 23:45:29 GMT; path=/; domain=.google.co.jp
set-cookie: NID=184=rA7ccN1BnJ2bixU7PmVQ8OUKzSbz9GHvvXa0JdMH2Uh0FHA3gCOu9sDg3jy9QzRgAlrTN9fsaK3QABOgjY7cGbJC7DEG5wKp3D7wYb4g7ftT9QJ_qleP9acX_Z4KoBhkXKF1LGmWALFgg--SEYBwYCbCL-7KgWDpdrEdb1TFqss; expires=Tue, 26-Nov-2019 23:45:29 GMT; path=/; domain=.google.co.jp; HttpOnly
この部分がcookieの実体です。
もっと具体的に言うと、
1P_JAR=2019-05-27-23;
NID=184=rA7ccN1BnJ2bixU7PmVQ8OUKzSbz9GHvvXa0JdMH2Uh0FHA3gCOu9sDg3jy9QzRgAlrTN9fsaK3QABOgjY7cGbJC7DEG5wKp3D7wYb4g7ftT9QJ_qleP9acX_Z4KoBhkXKF1LGmWALFgg--SEYBwYCbCL-7KgWDpdrEdb1TFqss;
この部分こそがいわゆるcookieになります。一つ前の例では expires
や path
といった文字列も含まれていますが、それらは有効期限などの付加情報になります。
先程の例で少し触れていますが、HTTPサーバ <-> クライアント(ブラウザ) 間でcookieをやり取りする仕組みは以下の図のようになっています。
まずサーバ側から、「このcookieを付けてきてね」という情報が set-cookie
として渡されます。
次にクライアントがアクセスするときにはその情報を cookie
というヘッダに付けて送ります。
こうしてcookieのやり取りが行われるわけです。
では実際にgoogleの例を使ってcookieを手で付けてみます。
まずgoogleの検索画面にアクセスします。
(今回はわかりやすくするためヘッダのset-cookieだけを抽出)
curl -Ss -D - https://www.google.co.jp | grep 'set-cookie'
set-cookie: 1P_JAR=2019-05-28-23; expires=Thu, 27-Jun-2019 23:54:31 GMT; path=/; domain=.google.co.jp
set-cookie: NID=184=SWRLSIx1X4rTGnhMDk_VAZ8998GT9d7XHx99QbKm0wAER7FZNjvgeWLzPSDaOwwhXvCb9-gcxLeN-JrGepGZjcKcPwbfZhGuNlQkTZ4RRBiF5OOsTFh-beEAvB3zALqr1AxWjAcnXvbACQ7c2JW_p_TK9YxG_-akrrDExZLyU9I; expires=Wed, 27-Nov-2019 23:54:31 GMT; path=/; domain=.google.co.jp; HttpOnly
上記のようなレスポンスが返ってきます。
このレスポンスのうち、最初のカラムがcookieですので、そこだけを抜き出しておきます。
ちなみに上記のように複数 set-cookie
ヘッダが付いている場合がありますが、 全て有効です ので、今回も2行分のcookieを付ける必要があります。
次にアクセスするときは以下のようにcookieを付けます。
curl -H "Cookie: 1P_JAR=2019-05-28-23; NID=184=SW(長いので略)LyU9I" https://www.google.co.jp
このように、-H
オプションで Cookie
というヘッダを付与することができます。
また ;
で区切ることで複数のcookieをつけることができます。
これでcookieを使ったやり取りができるようになりました。
ちなみにcurlにはcookieを扱うオプションが用意されています。
cookieを受け取る場合
curl -c cookie.txt https://www.google.co.jp
# ./cookie.txt というファイルにcookie情報が格納される
cookieを使う場合
curl -b cookie.txt https://www.google.co.jp
# ./cookie.txt というファイルのcookie情報を使う
以上となります。
スポンサーリンク