【初心者】PythonのrequestsライブラリでCookie情報を扱う

Python Python
Python

はじめに

今回はPythonのRequestsモジュールでCookieを扱う方法を備忘録として残していこうと思います。

背景は、FlaskなどでAPI開発を行なっている時に、Cookie情報を扱うことがありそもそも、結合テストなどで楽にCookie情報を扱う方法をまとめておこうと思った次第です。

Requestsライブラリ

インストール

PyPIで管理されているライブラリのため、Python仮想環境や各環境下でPipを使ったインストールで使えます。

$ pip install requests

RequestsライブラリでCookieを扱う

Cookieとは

CookieとはWebサービスなどにアクセスした際に、アクセスされたWebサーバがアクセス元のクライアントコンピュータ(Webブラウザ)に送信する小さなファイルのことです。

CookieはChromeなどのWebブラウザに保存され、保存された情報は各サーバオリジンごとにブラウザで管理されています。

ブラウザ上でオリジンごとに保存されたCookieは任意の破棄時間を持ち、破棄時間まではそのオリジンに対するリクエストと共にサーバに送られます。

Cookieの用途

Cookieは主に下記の3つの用途に用いられます。

  • セッション管理
  • 個人設定
  • ユーザートラッキング

HTTP通信内のCookie

WebサーバからクライアントへのCookieセット

こちらのサイトによるとCookieがセットされる指示が組み込まれたHTTPレスポンスの中身は下記のようになります。

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

レスポンスヘッダー内に”Set-Cookie: <cookie-name>=<cookie-value>“の形式で情報が組み込まれています。

クライアントからWebサーバへのCookie送信

一方でブラウザ上で保存しているCookie情報は下記のようにHTTPリクエスト内に組み込まれます。

GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry

こちらもリクエストヘッダー内に”Cookie: <cookie-name>=<cookie-value>“の形式で組み込まれています。

オリジンとは

スキームや、オリジンとはホスト名などのドメイン、Webサーバのポート番号などから構成される情報で、イメージとしてはブラウザのURLに表示されたり、入力される情報に近いです。

しかし、オリジンは上記のスキーム、ホストおよびポート番号により同一オリジンか、異なるオリジンかが分かれるため、厳密にはURL≠オリジンです。

例)https://hogehoge.comの場合

スキーム:https
ホスト: hogehoge.com
ポート:443番だがスキームがhttpsのため省略

同一オリジン例:https://hogehoge.com/getHoge

異なるオリジン例:https://hogehoge.com:5000

レスポンスでブラウザにクッキーをセットする処理を加える

それでは本題のPython RequestライブラリにおけるCookieの取り扱いについて説明します。

まずはWebサーバからのHTTPレスポンスにおけるCookieセット処理についてです。

今回は例としてFlaskのAPIを例に取り、/sessionときたらsession_keyをクライアントに返す処理を組みます。

Flaskの書き方は割愛します。

from flask import Flask, make_response, request

def create_app():
    app = Flask(__name__)
return app

app = create_app()

@app.route("/session")
def create_session_key():
    <Session Key作成処理は省略>
    session_key = 'AAAAAAA'
    response = make_response()
    response.set_cookie('session_key', session_key)
    return response, 200

レスポンス処理にCookie情報をブラウザ側でセットさせる命令を組み込むのはmake_response()モジュールのset_cookie()メソッドになります。

直接下記のようにHTTPレスポンスHeaderに組み込むことも可能です。

response.headers['Set-Cookie'] = 'session_key=AAAAAAA'

リクエストにクッキー情報を載せる

requestsライブラリにcookie情報を載せたいことってありますよね。

例えばWebスクレイピングや開発テストの時。

クライアントからrequestsライブラリを使ってWebサイトから情報を取得する際に、HTTPリクエストにCookie情報を載せないと取得できない情報がある場合や、Webアプリケーションを開発しているときにテストを実施するにあたり、擬似Cookie情報を載せたHTTPリクエストを送らないといけない場合があります。

そんな場合はrequestsライブラリを下記のように扱うと簡単にHTTPリクエストにCookie情報を擬似的に載せてて扱うことができます。

import requests

cookies = {"session_key": "AAAAAAAAAA"}
url = 'https://sample.coms'
res = requests.get(url=url, cookies=cookies)
res_json = res.json()

requestsのgetやpostモジュールにはcookiesという引数が用意されており、cookies引数にDict型でkey, valueを渡すことにより、任意のCookie情報をHTTPリクエストに載せて送ることができます。

厳密には内部的にヘッダー情報としてセットしてくれています。

また、参考程度ですが先ほど述べたように、Cookie情報はあくまでHTTPリクエストのヘッダー情報の一部ですので、cookies引数を使わずともheaders引数に直接ヘッダー情報として定義してから送ることもできます。

import requests

res = requests.get(
    url=<URL>, 
    headers={'Cookie': 'session_key=AAAAAA'}
)

res_json = res.json()

まとめ

いかがだったでしょうか。

今回はPythonのrequestsモジュールでCookieを扱う方法を記録として残しています。

今回の要点になります。

・Cookieはオリジンごとにブラウザで管理される

・CookieはHTTPのヘッダー情報の一部

・Pythonのrequestsライブラリではmake_responseモジュールのset_cookieでHTTPレスポンスにSet-Cookie処理を追加できる

・Pyrhonのrequestsライブラリではrequest.get()やrequests.post()などのHTTPリクエスト作成のメソッド内でcookies引数にセットすることでCookieを明示的にリクエストに載せることができる


タイトルとURLをコピーしました