【備忘録】tornado での XSRF 対策機能に関して

備忘録です。

tornado の XSRF 対策機能に関して、
色々と困ったり、調べたりしたので、忘れない様にメモ。

# ■ torando での XSRF 対策機能の有効無効について
詳しくは、以下のサイトに記載されているのでご参照下さい。

* [Hello Absurd World\!　Python\-Tornado: XSRF対策](http://elicon.blog57.fc2.com/blog-entry-367.html)

基本的に `xsrf_cookies` の値を変えることで、XSRF 対策機能の有効無効を設定できます。

# ■ XSRF 対策機能における GET メソッドについて

上述したサイトに記載されている様に、`check_xsrf_cookie` メソッドを呼び出して整合をチェックしますが、GET 以外の場合は `check_xsrf_cookie` メソッドを呼び出さなくてもチェックされる様です。

こちらにも記載されています。

* [post \- Tornado XSRF token without templating \- Stack Overflow](https://stackoverflow.com/questions/25183302/tornado-xsrf-token-without-templating)

# ■ form ではなく、ヘッダ情報を使った XSRF 対策のトークンの埋め込みについて

上述したやり方では、XSRF 対策のトークンをクッキーと form に埋め込んでいますが、ウェブ API などの場合はこういうやり方を使えないので、form の代わりにヘッダに `X-Xsrftoken` という項目でトークンを埋め込みます。

# ■ クッキーの XSRF 対策のトークンの確認について

こちらのサイトにも似た様な手順が記載されていますが、改めて。

* [Chrome で Cookie の削除、有効化、管理を行う \- パソコン \- Google Chrome ヘルプ](https://support.google.com/chrome/answer/95647?co=GENIE.Platform%3DDesktop&hl=ja)

1. パソコンで Chrome を開き、画面右上の「その他アイコン」のメニューをから「設定」を選択します。
    * ![スクリーンショット 2017-11-15 11.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/161939/6af28098-995a-87f7-05fd-f6dda0bb623c.png)
<br><br>
1. 下の方にある「詳細設定」をクリックします。
    * ![スクリーンショット 2017-11-15 13.10.11.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e84727d8-d903-3933-ff26-d2b15ed52795.png)
<br><br>
1. 「プライバシーとセキュリティ」から「コンテンツの設定」をクリックします。。
    * ![スクリーンショット 2017-11-15 13.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/161939/7ead8737-22f1-9481-201d-37ff9aa6b181.png)
<br><br>
1. 「コンテンツの設定」から「Cookie」をクリックします。。
    * ![スクリーンショット 2017-11-15 13.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c2687ae8-9dcc-f2dc-0c69-2c5f426b86ba.png)
<br><br>
1. 「Cookie」から「すべての Cookie とサイトデータ」の検索欄に所定のドメイン名を入力します。
    * ![スクリーンショット 2017-11-15 13.10.45.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c7ff23d8-8d54-7237-235a-ede3bb886ea7.png)
<br><br>
1. 「すべての Cookie とサイトデータ」に表示された所定のドメイン名をクリックします。
    * ![スクリーンショット 2017-11-15 13.10.53.png](https://qiita-image-store.s3.amazonaws.com/0/161939/659f2bb8-497c-41d4-38b9-b2a0ddd8bdd3.png)
<br><br>
1. 所定のドメインのクッキー情報の一覧が表示されるので、「_xsrf」をクリックすると XSRF 対策のトークン情報が表示されます。
    * ![スクリーンショット 2017-11-15 13.10.59.png](https://qiita-image-store.s3.amazonaws.com/0/161939/16a3dc95-d9d5-5f0b-4135-cfa6be8b1b68.png)

# ■ Restlet Client を使っての XSRF 対策機能の動作確認について

1. Restlet Client のインストール

    インストールも含め、基本的な機能については、以下のサイトを参考に。
    * [DHC REST Client \- RESTのAPIを実行するならこのツール \- 覚えたら書く](http://blog.y-yuki.net/entry/2016/11/01/000000)
<br><br>
1. XSRF 対策機能を無効にして、Restlet Client から GET
    * ![2.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4d46fe45-7dd8-a0b8-c1f5-e21e07bc6876.png)
<br><br>
1. XSRF 対策機能を無効にして、Restlet Client から POST
    * ![3.png](https://qiita-image-store.s3.amazonaws.com/0/161939/f589e2d3-f570-7353-9fa1-e0af1f0a40ea.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定しないで、Restlet Client から `X-Xsrftoken` 無しで GET
    * ![4.png](https://qiita-image-store.s3.amazonaws.com/0/161939/53d7acf2-2d12-d79d-f1aa-0a175640ce9e.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定しないで、Restlet Client から `X-Xsrftoken` 無しで POST
    * ![5.png](https://qiita-image-store.s3.amazonaws.com/0/161939/e5213496-83c1-6aca-66f8-0d8313ab06f0.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定して、Restlet Client から `X-Xsrftoken` 無しで GET
    * ![6.png](https://qiita-image-store.s3.amazonaws.com/0/161939/090ac84a-073a-ad73-d8e3-a2b13a54d00d.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定して、Restlet Client から `X-Xsrftoken` 無しで POST
    * ![7.png](https://qiita-image-store.s3.amazonaws.com/0/161939/323f1cbd-945e-3829-1627-5fe2339d2030.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定して、Restlet Client から `X-Xsrftoken` 有りで GET
    * ![8.png](https://qiita-image-store.s3.amazonaws.com/0/161939/05f5aeea-67d6-9e72-0f7a-7853ebc658f5.png)
<br><br>
1. XSRF 対策機能を有効＆ `check_xsrf_cookie` を設定して、Restlet Client から `X-Xsrftoken` 有りで POST
    * ![9.png](https://qiita-image-store.s3.amazonaws.com/0/161939/cacbf2f3-7636-e138-6c2a-e3297c946b41.png)
<br><br>
1. ざっくりとまとめ

<table>
<tr><th colspan=3 rowspan=3> </th> <th colspan="3">サーバ側</th></tr>
<tr><th align=center colspan=2>XSRF 対策機能<br>有効</th> <th align=center rowspan=2>XSRF 対策機能<br>無効</th></tr>
<tr><th align=center>check_xsrf_cookie<br>有</th> <th align=center>check_xsrf_cookie<br>無</th></tr>
<tr><td rowspan=4>Restlet<br>Client</td> <td rowspan=2>GET</td> <td>X-Xsrftoken<br>無</td> <td>6.<br>403 ERROR</td> <td rowspan=2>4.<br>200 OK</td> <td rowspan="2">2.
<br>200 OK</td></tr>
<tr><td>X-Xsrftoken<br>有</td> <td>8.<br>200 OK</td></tr>
<tr><td rowspan=2>POST</td> <td>X-Xsrftoken<br>無</td> <td>7.<br>403 ERROR</td> <td  rowspan=2>5. 403 ERROR</td> <td rowspan="2">3.<br>200 OK</td></tr>
<tr><td>X-Xsrftoken<br>有</td> <td>9.<br>200 OK</td></tr>
</table>

# ■ Swift (Alamofire) においてのヘッダ情報 (X-Xsrftoken) の追加について

まだ試していませんが、以下ののサイトを参考に出来るのでは無いかと思います。

* [\[Swift\]AlamofireでArrayで囲まれたJSONデータをPOST送信 \- Qiita](https://qiita.com/dondoko-susumu/items/3c898c683d4c9252210c)
* [AlamofireでRequestのHeaderにContent\-Type: application/jsonを追加したいのにいっこうに"text/plain"になってしまう問題 \- DRYな備忘録](http://otiai10.hatenablog.com/entry/2016/07/12/221045)