Note

3年後の自分のために書いています

sinatraとrailsとrfcとmdnと徳丸本から学ぶセッションとクッキーと認証とCSRFとXSS

半年前の下書き、めっちゃ途中だけど埋もれるのも嫌なので公開。(あとから追記していく)


元々 csrf についての記事を書こうと思っていたが、csrf について調べるうちセッションとクッキーのことが気になり、rails のセッションとクッキーの実装方法が気になり、フォーム送信と Ajax リクエストって具体的にどう違うんだっけと気になり、Ajax リクエストと fetch って一緒だっけ?違うっけ?と気になり、セッションベースとトークンベースで認証やる場合のメリット・デメリットが気になり、今に至る。

web の技術は全て連関しているのだと思う、これを機に連関する部分を全て理解したい。

セッションとは

ステートレスである HTTP で状態を保持するための仕組み。

クッキーとは

セッションを実現するための仕組み。 サーバ側で Set-cookie して、ブラウザで保持、Cookie はブラウザからサーバ側に常に送信される。

サーバ側ではこの cookie に入った session id もしくは 暗号化された session 情報そのもの(user id や password など?)によってユーザを識別する。

session id のみの場合はなんらかの cache storage(メモリやredisやdynamodb)に session id を key に session 情報を保存しておく。

※ session 情報ってどこまで?passwordは入れてもOK?csrfトークンも入れる?

セッション & クッキー の sinatra での実装

enable :sessions

👆 で session が有効になる。

enable の定義は ここ、中で .set してるだけ。

詳細見てないけど .set されることで デフォルトでは false の sessions が true になるんだと思う。

いろいろあってデフォルトでは session_store として Rack::Session::Cookie が使われてる ことが分かる。

rack の session 周りのコードは https://github.com/rack/rack/tree/master/lib/rack/session にある。

#set_cookie とか定義されてる。ここでヘッダの Set-Cookie に値突っ込んでる。

セッション & クッキーの rails での実装

サーバのどこでキャッシュしてるかとかも書く、キャッシュストレージの違いとか

結論 sinatra と同じく Rack::Session が使われていた。

キャッシュストレージが Memcached 前提だけど以下は参考になる。

Rails の session を完全に理解した

フォーム送信と Ajax リクエストの違い

Ajax リクエストと fetch って一緒だっけ?違うっけ?

社内 esa に書いた

CORS

POST で content-type application/json の場合はプリフライトリクエストが飛ぶ。(その時はサーバ側で header とか method の allow が必要)

See. https://github.com/daido1976/sinatra-vanilla-spa/pull/4

jwt での認証方法

セッションベースとトークンベースで認証やる場合のメリット・デメリット

MPA と SPA の認証方法の違いも書く

jwt トークンはブラウザのどこに保存するのが良いか

そして csrfxss