0
0

【初めてのWEB開発】Node.jsを使用した小説紹介サイト開発

Posted at

はじめに

約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を活用して画像のアップロードと管理を効率化しました。

セキュリティ対策

セキュリティは最重要事項の一つとして認識し、以下の対策を実施しました:

  1. 入力サニタイズexpress-mongo-sanitizesanitize-htmlを使用し、NoSQLインジェクションやXSS攻撃を防止。

  2. CSRF対策csurfミドルウェアを導入し、クロスサイトリクエストフォージェリを防止。

  3. レート制限express-rate-limitを実装し、DDoS攻撃やブルートフォース攻撃のリスクを軽減。

  4. セッション管理express-sessionconnect-redisを使用し、安全なセッション管理を実現。Redisをセッションストアとして採用し、セッションデータの永続化と高速アクセスを両立。

  5. 環境変数管理:機密情報はdotenvを使用して環境変数で管理し、ソースコード上に直接記述しないよう徹底。

  6. バリデーションJoiライブラリを使用してユーザー入力の厳格なバリデーションを実施。

  7. 安全なパスワード管理passport-local-mongooseを利用し、パスワードのハッシュ化とソルト化を自動化。

開発で直面した課題と解決策

  1. Herokuの無料プラン廃止対応
    Herokuの無料プランが終了したため、アプリケーションが定期的にスリープ状態になる課題がありました。これに対し、UptimeRobotを使用して定期的にアプリケーションにリクエストを送ることで、スリープ状態を回避しました。

  2. データベース設計の最適化
    小説情報とユーザー情報の関連付けに時間を要しました。最終的に、効率的なクエリが可能なスキーマ設計を採用し、パフォーマンスを向上させました。

  3. 非同期処理の管理
    APIリクエストやデータベース操作など、多数の非同期処理の管理に苦心しました。async/awaitを適切に使用することで、コードの可読性と保守性を向上させました。

  4. セッション管理の最適化
    大量のユーザーセッションを効率的に管理するため、Redisを導入しました。これにより、セッションデータの永続化と高速なアクセスを実現しました。

今後の展望

  1. 掲示板アプリの結合:本サイトの掲示板アプリを開発し、レビューの役割を持たせたいと思っています。

  2. ユーザー体験の向上:ユーザーフィードバックを基に、UIのさらなる改善や新機能の追加を検討しています。

  3. スケーラビリティの向上:将来的なトラフィック増加に備え、マイクロサービスアーキテクチャに移行するための学習をし、実装までしたいと思っています。

  4. テスト自動化:単体テストや統合テストの導入により、品質管理プロセスを強化する予定です。

  5. SEO対策:現在、metaタグなどの最低限のSEO対策しか施していないので、WEBサイトにおけるSEO対策についてもっと理解を深め、反映させていこうと思っています。

結論

本サイトの開発を通じて、フルスタック開発の経験を積むとともに、実践的なセキュリティ対策の基礎を学びました。今後も継続的な改善を行い、ユーザーにとってより価値あるプラットフォームを目指していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0