Cloudflare越しのhttpsサイトにcurlでアクセスしたらcookieのセッションが維持できない

状況

  • CDNとしてCloudflareを使用しているサイトがある。
  • そのサイトにログインし、Cookieによるセッションが確立している。
  • Firefoxの[ウェブ開発]で[cURLとしてコピー]をする。
  • コンソールでcurlを実行する。

問題とする現象

  • curlではCookieのセッション情報が無視されてHTTP403が発生する。

現象について補足1

  • Firefoxからのコピペなので当然だが、curlにはCookieにセッション情報も付与されている。
  • 実際はPHPSESSID(PHPのデフォルトで使用されるやつ)だった。
  • ブラウザではセッションは確立しており、ページ遷移しても維持できている。
  • 勘だがHTTP403はCloudflareが出しているように見える。

対策

  • curlにオプション–ciphers ECDHE+AESGCMを使用する

今は開発停止したが、Cloudfrareに接続するOSSのコードに”Removes problematic ciphers which cause the captcha page to show up”なる記述があった。
https://github.com/KyranRana/cloudflare-bypass/blob/master/src/main/CFCurlImpl.php
これを参考にした。

現象について補足2

  • curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
  • NGだったcurlのTLS接続: SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305
  • OKだったcurlのTLS接続: SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
  • FirefoxのTLS接続: TLSv1.3 / TLS-AES-128-GCM-SHA256
  • Cloudfreには”_cflb”というCookieのキーで”セッションアフィニティ”なるセッションの維持機能があるらしいが、それは使用されていなかった。
  • Cookieにるログインセッションの維持期間は年単位だった。

curlのTLS接続の確認は–verboseオプションを使用した。
そもそもCDNを使用しているサイトにcurlを使うことがこれまでなく、本当に偶然だったのでhttpでの接続だったらどうなるとかの検証はできていない。
TLSの再接続がCookieのログインセッションをリセットしているのかと思ったが、Cookieにるログインセッションの維持期間(expires)はまったく異なっていたので、これが意図した挙動であるとは思えない。