5/9です
やったこと
午前中がアルバイトかつ、午後から授業があったので疲れましたが、なんとかやりました。
とりあえず、一番の進展はこれです。ハッシュ関数を使ってホスト名、パス、クエリパラメータをハッシュ化するための関数を用意しました。
一番困ったのは、Goのホスト、パスの扱いです。
http.Request.Hostとhttp.Request.URL.Hostname()の違いなどを調べるのに悪戦苦闘しまして、、、大変時間がかかりました。
今も、なんとなくしかわかっていないのですが、http.Request.URL.Hostやhttp.Request.URL.Hostname()はサーバー側では大体の場合、空になります。
これはHostの情報が、Hostヘッダに書かれるため、http.Request.Hostに格納されるからです。
この仕様を完璧に理解するにはまだ時間がかかりそうです。
今現在キーとして、http.Request.Host, http.Request.URL.Path, http.Request.URL.Query()を使っています。 できればHeaderの値とか、Cookieとかもキーに含めたいところ。
DockerのコンテナにIPv4アドレスをつけたり、Dockerのマルチステージビルドを少しやってみたりしました。
マルチステージビルドでは、二つのイメージを使って、ビルド環境と実行環境を作成することにより、無駄なものを実行環境のコンテナに含めないようにするらしい。
無駄なものがないってことは、セキュリティ的にも攻撃者が侵入のために使えるアプリを少なくしたりできるので、いいんだろうな。(こういうのをセキュリティの攻撃面というらしい。)
もちろん、キャッシュの効きがよくなったりするので、ビルド速度が上がったりもするらしい。
やっぱり手軽に通信させて遊んだりできるので、Dockerは最高ですね。
知らないことがたくさんあるので、まだまだ色々勉強したい。
上の二つ以外に、Go言語の勉強もした。特に、HandlerFuncとかのhttpモジュール周りのことをたくさん調べた。
ミドルウェア的な処理ができるっぽいので、loggerを仕込んだりしてみた。
ついでに、わかったこととして、httputil.ReverseProxy.Rewrite関数は、送られてきたリクエストを処理するだけなので、Rewriteの中でキャッシュがあるからそのまま送り返す的な処理はできない!
httputil.ReverseProxy.ModifyResponseを使えるかなぁと思ったけど、Rewriteの中でキャッシュがあるかないかを管理するフラグを生成して、値を設定したとしても、そのフラグはどこで管理するんだって話になってしまう。
簡単に書くと、RewriteとModifyResponseの間で状態の共有をどうやってやろうかなってこと。また、難しい問題に直面してしまったし、何よりこれは別に本質的な問題ではなくて、ただの書き方の問題だってことも、また俺を嫌な気持ちにさせる要因。
やりたいことリスト
頼みます!!セキュリティキャンプ受からせてください!!