Node.js Expressの例を通じて、WebアプリにおけるCookieについて理解する

## はじめに
Web アプリケーションが快適に利用できるのは Cookie のおかげとよく言われると思う。今回は、そんな Cookie が何をしてくれているものなのか？について理解しつつ、実際に Node.js の Express で Cookie の実装をやってみたのでその備忘録を残す。

## Cookie とは何か？
簡単に一言で言ってしまうと、「クライアントの状態をテキストで保存する仕組み」の事。

ここで言うクライアントというのは Web アプリなどを開くブラウザの事だと思ってよく、Cookie は Web アプリなどを利用しているユーザに関する状態を保存するためも仕組みと言い換えられるだろう。

具体的にどのような動きをするか？だが、以下の図に示したようにサーバを起点にしてクライアントにテキスト情報が送られ、これをクライアントはそのままサーバに送り返すという事をする。やっている事はこれだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/797e20da-0b68-ec5b-cd16-ecc6495b6133.png)

もう少し詳細を見ていくために、HTTP 通信の中身を見てみて実際に何がやり取りされているか？を見みてみる。
動きとしては、以下の図のようにリクエストの時にその Header に"Set-Cookie:"という属性があり、これによりクライアントの Cookie にキーと値がセットで保存される。次にクライアントがサーバーにリクエストする時には、Cookie に保存されている情報がリクエストの Header の"Cookie:"に自動的に設定され、サーバーに送信される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/b1e1a7ce-b3b4-f913-cc91-657749d6aefc.png)

実際のブラウザに保存されている Cookie の値は、Chrome を例にすると、以下のように確認する事ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/4aecead1-df53-e2d2-41a5-baf1acd7f87b.png)

## Node.js Express での Cookie の実装
『Cookie とは何か？』の章で見たように、Cookie はサーバーから送信する情報となる。Express ではどのように実装するか？だが、公式の[res.cookie(name, value [, options])](https://expressjs.com/en/4x/api.html#res.cookie)に実装方法は載っているので、これを参考に実装してみる。

ソースコードとしては以下のように、"res.cookie('message', 'hello world!');"とするだけでいい。これで"message"というキー名で"hello world!"という値（value）をクライアント（ブラウザ）の Cookie に保存する事ができる。あとは、クライアントからのリクエスト時にリクエストヘッダに設定されて送られてくる Cookie の値を読み込む（"console.log(req.cookies.message);"の部分）だけ。

```js
import express from 'express';
import cookie from 'cookie-parser';
...

app.use(cookie());
app.use((req, res, next) => {
	console.log(req.cookies.message);

	res.cookie('message', 'hello world!');

	next();
});

app.use('/', router);

app.listen(3000, () => {
	console.log(`Application listening at 3000`);
});
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/post-restaurant-reviews/commit/006e421832528230e600aecfe99c1ee2877c0094

※今回はリクエストヘッダに含まれる Cookie を取り出すのに、[cookie-parser](https://github.com/expressjs/cookie-parser)というミドルウェアを利用した。これは[cookie-parser](http://expressjs.com/en/resources/middleware/cookie-parser.html)に書かれているように、「Cookie ヘッダを解析し、Cookie 名をキーにしたオブジェクトを req.cookies に格納」してくれるもの。

※上記の実装は ES Modules を利用した実装になっているが、Node.js で ES Modules を利用する方法については[Node.js で import・export（ES6 の構文）を使えるように webpack × Babel の設定をやってみた](https://note.com/shift_tech/n/n77562e0926e3)を参照。

- 参考：[RFC6265 HTTP State Management Mechanism](https://datatracker.ietf.org/doc/html/rfc6265) 
- 参考：[HTTP Cookie の使用](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies)

## まとめとして
今回は Cookie とはについて、実際に Node.js Express での実装を見ていく事で理解を深める事ができた。次はセッション管理の際に Cookie をどのように使用していくのか？などについても実際に実装してみて理解していきたい。

※今回は簡易的に Cookie を利用する方法として cookie-parser のようなミドルウェアを利用したが、実際にプロダクトレベルで実装する際には、[Use cookies securely](https://expressjs.com/en/advanced/best-practice-security.html#use-cookies-securely)に書かれているような実装をし、セキュアに Cookie を利用できるようにする必要があるので注意。

## 参考文献
- 参考：[「分かりそう」で「分からない」でも「分かった」気になれる IT 用語辞典](https://wa3.i-3-i.info/word1725.html)  
- 参考：[初心者でもわかる『Cookie（クッキー）』講座 危険性やスマホでの設定方法もズバリ解説](https://time-space.kddi.com/ict-keywords/20180726/2392)