半年前の下書き、めっちゃ途中だけど埋もれるのも嫌なので公開。(あとから追記していく)
元々 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 前提だけど以下は参考になる。
フォーム送信と 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 の認証方法の違いも書く