IBM Cloud: VPC Load BalancerのCookieベースのセッションパーシスタンス機能

#1. はじめに
IBM CloudのVPC Load Balancerでは長らくSource IPベースのセッションパーシスタンス機能しか提供されていませんでしたが、新規にCookieベースのセッションパーシスタンス機能も提供されるようになったので試してみました。
https://cloud.ibm.com/docs/vpc?topic=vpc-release-notes#june-17-2021&locale=en


Cookieベースのセッションパーシスタンス機能には２つあり、

- `HTTP cookie` persistence: VPC Load Balancerが`IBMVPCALB`というprefixを付けてCookie情報を挿入する方法
- `APP cookie`(Application cookie) persistence: **VPC Load Balancerが設定する`IBMVPCALB`に加えて**、利用者がWebサーバーなどで発行するCookie情報を元にセッションパーシスタンスを実現する方法。

の２つ存在します。以下ではその２つのセッションパーシスタンス機能を試してみました。


#2. HTTP cookie persistence

Back-end poolのプール設定にて、Session stickinessとして`HTTP cookie`を選択します。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d8edb3d2-3daa-9194-113b-3febf6e34839.png">


```txt:HTTP利用時
# curl -I http://<VLB-LBのFQDN>
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2021 03:04:48 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 02:09:34 GMT
ETag: "11-5c500d09e56d8"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-8aaa4e0f-ad99-4d20-b17d-5aa75cd10da7=554e919fd77f334266c7b48f03cec0165a59a8fa; path=/
Cache-control: private
```

HTTPSの際には、`Secure; SameSite=None`が追加属性として設定されます。

```txt:HTTPS利用時。
# curl -I  https://<VLB-LBのFQDN>
Date: Fri, 18 Jun 2021 03:05:00 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 02:09:34 GMT
ETag: "11-5c500d09e56d8"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=c3fa5c11aa1931948a4530cb2b94d0aba050fcc6; path=/; Secure; SameSite=None
Cache-control: private
```

```txt:連続アクセス（Cookieのセットなし。セッションパーシスタンスが効いていない。）
# while true; do curl https://<VLB-LBのFQDN>; sleep 1; done
Server2
Server1
Server2
Server1
Server2
Server2
Server1
Server1
Server2
Server2
Server1
Server1
Server2
```

```txt:連続アクセス（Cookieのセットあり。セッションパーシスタンスが効いている）
# while true; do curl -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=c3fa5c11aa1931948a4530cb2b94d0aba050fcc6;"  https://<VLB-LBのFQDN> ; sleep 1; done
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
Server2
```

#3. Application cookie persistence

[IBM Cloud docs](https://cloud.ibm.com/docs/vpc?topic=vpc-advanced-traffic-management#session-persistence&locale=en)によると、Application cookie persistenceの特徴は以下の通り。

- Back Endサーバー（Webサーバー）側でCookieを発行する必要があり、そのCookie名をVPC Load Balancerに設定することで利用可能となる（今回はCookie名として`TEST1`を設定してみました）。
- VPC Load Balancerは、**依然として**`IBMVPCALB`というprefixを持つCookieを発行する。よって、ClientはVPC Load Balancerから発行された`IBMVPCALB`というprefixを持つCookieと、Back Endサーバー(Webサーバー）で発行されたCookieの２つを受け取る。
- Clientはこの2つのCookieをVPC LoadBalancerに送ることで、セッションパーシスタンスが有効になる。**逆に、どちらか一方を送付しただけではセッションパーシスタンスは機能しない**。
- **`IBMVPCALB`に対するCookieは利用者は制御できないが、Back Endサーバー（Webサーバー）で発行されたCookieについては名前や有効期間を制御できるので、いつまでセッションパーシスタンスを持続させるかなどを操作可能となる。**


Back-end poolのプール設定にて、Session stickinessとして`APP cookie`を選択します。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e2d738dc-db8d-f31a-30f8-81cf4da370e3.png">

```txt:バックエンドサーバーでは実はCookieを発行していないのだが、それでもVPCLoadBalancerはIBMVPCALBというprefixを持つCookieをクライアントに送ってくる。
# curl -I https://<VLB-LBのFQDN>
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2021 05:46:44 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Fri, 18 Jun 2021 05:29:53 GMT
ETag: "8-5c5039d058e10"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8
Set-Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3; path=/; Secure; SameSite=None
Cache-control: private
```

```txt:連続アクセス（IBMVPCALBに対するCookieは設定されているが、TEST1に対しては設定がないため、セッションパーシスタンスが効かない）
# while true; do curl -k -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3;"  https://<VLB-LBのFQDN>; sleep 1; done
Server2
Server1
Server1
Server2
Server2
Server1
Server2
Server1
Server2
Server1
Server2
Server1
Server1
```

```txt:連続アクセス（IBMVPCALBおよびTEST1に対するCookieが設定されているため、セッションパーシスタンスが有効）
# while true; do curl -k -H "Cookie: IBMVPCALB_r022-901d2e7d-531d-49c3-8b5c-f2acfa2ec7f3=5b02d1a9bbeec0e313f1e2189550a526d6d9e7f3; TEST1=hogemoge"  https://<VLB-LBのFQDN>; sleep 1; done
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1
Server1
```