書籍「基礎からのWeb開発リテラシー」レビュー

## レビュー者について
・事業会社でのコーポレートIT歴10年ほど
・Webシステム開発 & ECサイト構築経験あり
・ただし運用保守メインで内製開発経験は少なめ

## 本の目次

|章 　　| 内容　　　　　　　　　 |
|:-----------|:------------|
|第一章      |Webの概要　　　　　　　　 　|
|第二章      |Webサイトの構成　　　　 　　| 
|第三章      |Webサーバーへの配置　　　　 |
|第四章      |Webに関するネットワーク　　 |
|第五章      |Webのセキュリティ　　　　　 |
|第六章      |ECサイトの設計と運用　　　　|
|第七章      |ECサイト制作に求められる知識|

## 感想
###### 一章
ブラウザソフトがWebページを表示するときに実行される要求と応答について図が提示されていて大変分かりやすかったです。HTMLファイル、スタイルシート、画像データ、JavaScriptのソースコードなど複数の要求が送信される様子が分かります。

DBMSを使うメリットについて日頃、言語化する事は少なかったのですが本書では明確に「データモデルの定義、同時実行制御、耐障害性、セキュリティ」の責務をDBMSにオフロードしている事が記述されてあります。

3層アーキテクチャの解釈について。サーバーに利用するソフトウェアで3つに分ける考え方とプログラム内部の処理で3つに分ける考え方の2種類の分け方について説明がありました。MVCモデルは後者の考え方を適用したWebフレームワークとの事でした。

サーバーサイドでプログラムを実行する手法としてCGIとアプリケーションサーバーがあります。Webサーバーに役割について平易な言葉をつかい説明されてあり感心しました。SSGやヘッドレスCMSについての記述も必見です。

###### 二章
HTMLの基本についてはタグ、属性、要素（ブロック、インライン）、コンテンツモデルでの分類、DOMの説明が、CSSの基本については3種類の書き方、CSSフレームワーク、Sassの使用に関して説明がありました。

OGPの指定、AMPの対応、HistoryAPIを使ったSPA、PWAの紹介があり、業務で使う機会がなかったので勉強になりました。

Web技術のトレンドとしてTypeScriptからJavaScriptへの変換（トランスパイル）、複数のJavaScriptファイルを統合するモジュールバンドラ（gulp、webpack）、自動整形ツール（HTML-lint、ESlint、Stylelint、JSONlint、YAMLlint）の紹介がありフロントエンド界隈の常識を知りました。

とは言えHTMLで構造を記述し、CSSでデザインし、動的な処理をJavaScriptで実装する開発方法は1990年代から変わりない、との事でした。

###### 三章
SSHを使ったファイル転送に関して。scpコマンドではなくrsyncコマンドが推奨との事でした。業務でsftpを使う事がありますがrsyncを使う機会があれば使いたいと思いました。

CI/CDの採用に関してはサンプルコード、テスト自動化の事例があればイメージしやすいのではと思いました。

chmodコマンドで3つのユーザー権限を指定する説明は図、記述ともに丁寧で大変分かりやすかったです。

###### 四章
URLについてプロトコル（スキーム）、ホスト名+ドメイン名（FQDN）、ディレクトリ名+ファイル名（パス）、ポート番号の用語説明や独自スキーム、オリジン（FQDN+ポート番号）についても記述がありました。

Chrome DevToolsを使ったHTTPリクエスト（リクエストライン、HTTPリクエストヘッダ、HTTPリクエストボディ）、HTTPレスポンス（ステータスライン、HTTPレスポンスヘッダ、HTTPレスポンスボディ）について確認方法が書いてありページ生成、レンダリングの順が分かり基礎知識が身に着くと思います。

プログラム実行に関してビルド（コンパイル、リンク）が行われるコンパイラ型とJITコンパイラで実行時に変換を行うインタプリタ型の説明がありました。JavaScriptは後者ですが最適化処理により高速に処理されている、との事でした。

HTTP/3やQUICについても説明があれば良かったと思います。

###### 五章
クロスサイトスクリプティング（XSS）について図を用いて分かりやすく説明してあります。脆弱性のあるWebサイトでJavaScriptの実行を企んでいる攻撃者は利用者がそのサイトに転送させるよう、URLクリックさせようと工夫を凝らしています。またDOM based XSSについても説明があり、HTML生成時に選択されるスキーム、DOM操作、JavaScriptライブラリに意識を向ける必要があると感じました。

クロスサイトリクエストフォージェリ（CSRF）では攻撃者が用意したテキストを脆弱なWebサイトの入力フォームに投稿するようにformタグの属性にURLリンクの仕掛けが作られてあります。サーバー側でトークン発行（ハッシュ値）とトークン確認を行う事で正規の入力画面以外からの投稿は拒否する事ができるようです。同一オリジンポリシーの設定によりトークンの偽装取得を防ぐことができるとの事でした。

無料から使える脆弱性診断ツール（OWASP ZAP、OpenVAS、Fiddler、Burp Suite、nmap）の紹介がありました。機会があれば利用してリテラシーを高めたいと思います。またペネトレーションテストのツール紹介もあれば良かったと思いました。

アクセスログはIPアドレス、日時、リクエスト、ステータスコード、転送量、アクセス元、ユーザーエージェントが記述された情報です。syslogサーバーへのログ転送とFluentdでのログ管理について比較した説明があり勉強になりました。

ファイル（.htaccess、.htpasswd）とBase64エンコードを使ったBasic認証、パスワードをハッシュ化したダイジェスト認証、セッションIDとHTTPS通信を使ったフォーム認証の3つの認証方法について理解を振り返る事ができました。

ソーシャルログインではOAuthと言う技術を使い、SNSから限定されたアクセス権限を付与したアクセストークンをサードパーティーアプリに渡す事でSNSのIDでログインできる仕組みです。LaravelではSocialite、Ruby on RailsではOmniAuthという便利なライブラリがあり、Webサイトにソーシャルログインの機能を実装する際は役に立ちそうです。SNS側に開発者向けのサービスがあり、そちらに連携したいサービス名やURLを登録する必要があるとの事でした。

###### 六章
データベース設計について復習できました。第1正規化は同じ意味のデータ繰り返しを排除し別テーブルに分離する。第2正規化は主キー以外の項目（非キー属性）について、主キーの一部の要素だけで決まる（部分関数従属）ものがあれば別テーブルに分離する。第3正規化は主キー以外の項目（非キー属性）について、依存関係のあるもの（推移的関数従属）があれば別テーブルに分離する。

開発工程における単体テストではプログラム処理で期待される結果を記述したテストプログラムを作成し、そのテストプログラムが全て正常な結果を返すようソースコードを書く事が常識のようですが私の現場ではなかなか実践できておりません。今後、取り入れていきたいと思います。また同値分割や境界値分析、カバレッジの測定指標（命令網羅、分岐網羅、条件網羅）について記述があり勉強になりました。

###### 七章
個人情報保護方針、情報セキュリティポリシー、利用規約（免責事項、禁止行為）について平易な説明がありました。技術書で学ぶ機会はあまりないので用語を知るだけでも有益と思います。