← 前へ: Phase 5.9 | 目次 | 次へ: 最終成果物課題 →
実行前に共通セットアップと各Phaseの確認手順を確認してください。演習コードはwork/で前のPhaseから引き継ぎます。
このフェーズでは、これまでのすべてのフェーズで構築してきた要素を統合し、
自分自身のWebアプリケーションスタックを完成させる
ことを目的とします。
ここまであなたは以下を個別に実装してきました:
- HTTPサーバ(またはRack対応サーバ)
- ルーティング
- Controller / Action
- View / Template
- Middleware的な仕組み
- ORM(Model / BaseModel)
- バリデーション
- Consoleモード
このフェーズでは、それらをすべて組み合わせて、
実際に動くCRUDアプリケーションを完成させます
以下を説明できる状態になること:
- 各レイヤーがどのように連携しているか
- リクエストがどのように流れるか
- 自分の実装がどの責務を担っているか
- Railsとの構造的な違い
- 自作スタックで動くWebアプリを構築できる
- CRUD機能を実装できる
- 各レイヤーの責務を説明できる
- 自分の設計のトレードオフを語れる
- Phase 1〜5 完了
- すべてのコンポーネントが動作している
まずは作るアプリを決めます。
- CRUDが成立すること
- シンプルでよい(複雑にしない)
- ユーザー管理
- タスク管理
- メモアプリ
- テーブル設計を行う
- カラムを決める
- どのデータを持つべきか?
- どこまでがModelの責務か?
- BaseModelを継承したModelを作る
- バリデーションを定義する
- save / find / where が使えること
- 一覧(index)
- 詳細(show)
- 新規作成(create)
- 更新(update)
- 削除(destroy)
- URL設計はどうするか?
- RESTっぽくするか?
- 各アクションを実装
- SQLを書かない
- Model経由で操作する
- Controllerの責務は何か?
- 一覧画面
- 詳細画面
- フォーム
Phase 4.5の出力エスケープをフォームとDBからの再表示にも適用します。フォームの値は引用符付き属性としてエスケープし、保存した文字列をHTMLとして実行させないでください。
CSRFは、別サイトから利用者のブラウザに意図しない状態変更リクエストを送らせる攻撃です。Cookie認証ではCookieが自動送信される点が問題になります。認証のないローカルアプリも、別サイトからのリクエストでデータが変わる危険があります。ループバック待受やHTTPS、POSTに変えることだけでは防げません。
この演習では、状態変更を行うフォームにCSRFトークンを導入します。サーバ側で管理する利用者のセッションに、暗号学的に推測困難なトークンを結び付けて発行し、フォームのhiddenフィールドに埋め込みます。受信時はセッションに対応するトークンをDB更新前に検証し、欠落・不一致なら403などで拒否します。全利用者で共通の固定値を使ったり、トークンをURLやログへ出したりしないでください。セッションの識別子も推測困難なものにし、Cookieからサーバ側のセッションを参照します。
- GETでは作成・更新・削除が起きない
- 正しいセッションとトークンの組み合わせで作成・更新・削除できる
- トークンなし・改ざん済み・別セッションのトークンでは、すべての状態変更ルートで拒否され、DBが変わらない
- ブラウザのフォームから保存した
<script>などの入力も、一覧・詳細・編集画面で文字列として表示される
まず一時DBとテスト用セッションで失敗テストを書き、Step 8の共通処理などに検証をまとめてください。CookieのSameSite属性やOrigin検証は追加の防御として学び、属性の設定だけで完了としません。ここで導入する最小のセッション管理・トークン検証も、本番用途の認証・認可を満たすものではありません。参照: OWASPのCSRF対策。
- Viewはどこまでロジックを持つべきか?
1つのリクエストを追跡してください:
HTTPリクエスト
→ Router
→ Controller
→ Model
→ DB
→ View
→ HTTPレスポンス
- どこで何が行われているか?
- 共通処理を導入する
例:
- ログ出力
- 簡易認証
- バリデーションエラー
- 存在しないID
- 不正リクエスト
- どの層で処理するべきか?
以下を確認:
- 一覧表示
- 作成
- 更新
- 削除
- エラー処理
- 待受先をソケット一覧で確認し、ループバックだけで動作している
- 外部公開せず、ダミーデータだけでデモする
- 秘密鍵がGitの追跡対象・コミット予定・配信対象に含まれていない
- XSS・CSRF・SQLインジェクションの必須テストが統合後も通る
- ファイル配信/一覧を実装した場合は、パストラバーサル対策のテストも通る
- READMEに列挙した防御について、未実装の項目と影響を説明できる
これらは学習の完了条件です。本番利用・外部公開は引き続き禁止です。
以下を説明できるようにしてください:
- Router
- Controller
- Model
- View
- 入力 → 処理 → 出力
- 良い点
- 問題点
- Railsでは何が自動化されているか?
- 自分の実装と何が違うか?
- なぜその違いがあるのか?
以下を準備してください:
- CRUD操作を実演
- 実際に動くことを確認
- ループバックだけで起動し、画面共有または録画で見せる(公開URLは作らない)
必ず含めること:
HTTP → Router → Controller → Model → DB
↓
View
- 何をしているか
- なぜ必要か
- 同じ点
- 違う点
- 一番重要な理解
- 意外だったこと
- 足りない機能
- 改善したい点
- Webアプリ全体
- 技術説明
以下を説明:
- システム全体の構造
- 責務分離
- トレードオフ
- 全体が統合されているか
- レイヤーが分離されているか
- 説明できるか
- 設計に一貫性があるか
- Railsとの比較ができているか
→ 理解が浅い
→ 設計崩壊
→ Model責務違反
→ ORMの意味がない
→ 責務違反
このフェーズで得るべき理解は:
Webアプリケーションとは、
複数の責務が分離されたコンポーネントの協調動作である
あなたはここまでで:
- HTTPを理解し
- サーバを実装し
- フレームワークを構築し
- ORMを作り
- それらを統合した
これはつまり:
「Webアプリケーションをゼロから説明できる」
状態です。
この研修のゴールは「作れること」ではありません。
「なぜその構造になっているのかを説明できること」
です。
ここまで来たあなたは、
- AIのコードを鵜呑みにしない
- フレームワークを盲信しない
- 自分で判断できる
エンジニアになっています。
この状態を、実務で活かしてください。