はじめに
約1ヶ月ほどで友人と共同開発した小説紹介サイト「ノベルバース」について、使用技術や開発過程で直面した課題、そしてセキュリティ面での取り組みを紹介します。
サイト概要
サイト名:ノベルバース (https://www.novelverse.net)
ノベルバース(以下、本サイト)は、次に何を読もうか迷っている人が最新情報を元に、手軽に小説を探せることを目的に設計されました。ユーザーは多様なカテゴリーや作家名から小説を探索し、お気に入りの作品をブックマークできます。
主な機能
- アカウント管理(作成、削除、ログイン、ログアウト)
- 多様なカテゴリーによる小説一覧表示
- 小説詳細情報の閲覧
- ブックマーク機能(「読みたい+」ボタン)
- 検索機能(全文検索および作家名検索)
- お問い合わせフォーム
使用技術
開発に使用した主要な技術スタックは以下の通りです:
フロントエンド
- HTML / CSS
- JavaScript (Vanilla JS)
- EJS(テンプレートエンジン)
バックエンド
- Node.js(Express)
データベース
- MongoDB
認証
- Passport.js
インフラ
- Heroku(ホスティング)
- UptimeRobot(監視ツール)
外部サービス/API
- Resend(メール配信サービス)
- Cloudinary(画像ホスティング)
バックエンド
Express.jsをベースにしたRESTful APIを構築し、MongoDB(Mongoose ODM使用)でデータを管理しています。認証にはPassport.jsを採用し、ローカル戦略を実装しています。
フロントエンド
サーバーサイドレンダリングにEJSを使用し、動的なUI操作にはVanilla JavaScriptを採用しました。これにより、シンプルながら柔軟な実装を実現しています。
データベース設計
MongoDBを採用し、小説情報、ユーザーデータ、ブックマーク情報などを柔軟なスキーマで管理しています。
API統合
Resend APIを使用してアカウント作成時のメール送信とお問い合わせフォームからのメール送信を実装し、Cloudinaryを活用して画像のアップロードと管理を効率化しました。
セキュリティ対策
セキュリティは最重要事項の一つとして認識し、以下の対策を実施しました:
-
入力サニタイズ:
express-mongo-sanitize
とsanitize-html
を使用し、NoSQLインジェクションやXSS攻撃を防止。 -
CSRF対策:
csurf
ミドルウェアを導入し、クロスサイトリクエストフォージェリを防止。 -
レート制限:
express-rate-limit
を実装し、DDoS攻撃やブルートフォース攻撃のリスクを軽減。 -
セッション管理:
express-session
とconnect-redis
を使用し、安全なセッション管理を実現。Redisをセッションストアとして採用し、セッションデータの永続化と高速アクセスを両立。 -
環境変数管理:機密情報は
dotenv
を使用して環境変数で管理し、ソースコード上に直接記述しないよう徹底。 -
バリデーション:
Joi
ライブラリを使用してユーザー入力の厳格なバリデーションを実施。 -
安全なパスワード管理:
passport-local-mongoose
を利用し、パスワードのハッシュ化とソルト化を自動化。
開発で直面した課題と解決策
-
Herokuの無料プラン廃止対応:
Herokuの無料プランが終了したため、アプリケーションが定期的にスリープ状態になる課題がありました。これに対し、UptimeRobotを使用して定期的にアプリケーションにリクエストを送ることで、スリープ状態を回避しました。 -
データベース設計の最適化:
小説情報とユーザー情報の関連付けに時間を要しました。最終的に、効率的なクエリが可能なスキーマ設計を採用し、パフォーマンスを向上させました。 -
非同期処理の管理:
APIリクエストやデータベース操作など、多数の非同期処理の管理に苦心しました。async/awaitを適切に使用することで、コードの可読性と保守性を向上させました。 -
セッション管理の最適化:
大量のユーザーセッションを効率的に管理するため、Redisを導入しました。これにより、セッションデータの永続化と高速なアクセスを実現しました。
今後の展望
-
掲示板アプリの結合:本サイトの掲示板アプリを開発し、レビューの役割を持たせたいと思っています。
-
ユーザー体験の向上:ユーザーフィードバックを基に、UIのさらなる改善や新機能の追加を検討しています。
-
スケーラビリティの向上:将来的なトラフィック増加に備え、マイクロサービスアーキテクチャに移行するための学習をし、実装までしたいと思っています。
-
テスト自動化:単体テストや統合テストの導入により、品質管理プロセスを強化する予定です。
-
SEO対策:現在、metaタグなどの最低限のSEO対策しか施していないので、WEBサイトにおけるSEO対策についてもっと理解を深め、反映させていこうと思っています。
結論
本サイトの開発を通じて、フルスタック開発の経験を積むとともに、実践的なセキュリティ対策の基礎を学びました。今後も継続的な改善を行い、ユーザーにとってより価値あるプラットフォームを目指していきます。