Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】🔑 NestJS Expert Series (Part 3): Authentication & Authorization with JWT and Guards your

2025年10月04日に「Dev.to」が公開したITニュース「🔑 NestJS Expert Series (Part 3): Authentication & Authorization with JWT and Guards your」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

NestJSアプリのセキュリティ強化について解説。誰がアクセスできるか(認証)と何ができるか(認可)を実装する。JWTでユーザーを識別し、Guardsで役割に応じたアクセス制限をかけることで、安全なアプリケーションを構築する基礎を学ぶ。

ITニュース解説

NestJSを使ったアプリケーション開発において、データの安全性は非常に重要だ。そのため、アプリケーションへのアクセスを適切に管理する仕組みが必要となる。この記事では、Webアプリケーションをセキュアにするための二つの主要な概念、「認証 (Authentication)」と「認可 (Authorization)」について、NestJSでどのように実現するかを解説する。

まず、認証とは「あなたが誰であるかを確認すること」を指す。例えば、Webサイトにログインする際にユーザー名とパスワードを入力し、その情報が登録されているものと一致するかを確認するプロセスがこれにあたる。一方、認可とは「あなたが何ができるかを確認すること」だ。認証されたユーザーが、特定のリソースへのアクセス権限や、ある操作を実行する権限を持っているかどうかを判断する。例えば、ログインしたユーザーが一般ユーザーなのか、管理者なのかによって、アクセスできるページや実行できる機能が異なる場合がこれにあたる。これらの仕組みを適切に実装することで、不正アクセスや情報漏洩からアプリケーションを守ることが可能となる。

この記事で採用するのは、認証メカニズムとして「JWT (JSON Web Token)」を利用する方法だ。JWTは、情報をコンパクトでURLセーフな形式で表現するための標準的な方法であり、特にWebアプリケーションの認証で広く利用されている。JWTが選ばれる主な理由はその利便性にある。一つは「ステートレス」であること。これは、サーバー側でユーザーのセッション情報を保持する必要がないことを意味し、サーバーのリソース消費を抑え、大規模なシステムでのスケーラビリティを向上させる。また、JWTはさまざまなプラットフォームで利用できる「クロスプラットフォーム」な性質を持つため、Webアプリケーションだけでなく、モバイルアプリやマイクロサービス間での認証にも適している。

JWTベースの認証システムを構築するには、いくつかのステップを踏む必要がある。最初に、NestJSアプリケーションに必要なライブラリをインストールすることから始める。これには、JWTの生成と検証を扱うためのライブラリや、パスワードのハッシュ化(元のパスワードが特定できない形に変換すること)を行うためのライブラリなどが含まれる。

次に、認証関連の機能をまとめるための「認証モジュール」を作成する。このモジュールの中に、認証処理のロジックを記述する「サービス」と、クライアントからのリクエストを受け付ける「コントローラ」を配置する。サービスはパスワードのハッシュ化や検証、JWTの生成といった具体的な処理を担当し、コントローラはユーザーからの登録やログインのリクエストを受け取り、サービスを呼び出してその処理結果を返す役割を担う。

ユーザー情報をデータベースに保存するための準備も重要だ。通常、ユーザーのID、メールアドレス、ハッシュ化されたパスワード、そしてそのユーザーの「役割 (role)」(例えば「一般ユーザー」や「管理者」など)を管理するためのデータモデルを定義する。このデータモデルに基づいてデータベースにテーブルを作成し、ユーザー登録時に必要な情報を保存できるようにする。パスワードはセキュリティのため、必ずハッシュ化して保存する必要がある。

認証サービスの中では、主に三つの重要な機能が実装される。一つ目は、ユーザーが入力したパスワードをハッシュ化する機能だ。これにより、データベースに保存されるパスワードが万が一漏洩しても、元のパスワードが直ちに判明することを防ぐ。二つ目は、ユーザーがログイン時に入力したパスワードと、データベースに保存されているハッシュ化されたパスワードが一致するかを検証する機能だ。これにより、正しいパスワードを持つユーザーのみがログインできる。そして三つ目は、認証が成功したユーザーに対してJWTを生成する機能だ。このトークンには、ユーザーのIDやメールアドレス、役割といった情報が暗号化されて含まれ、クライアントは以降のリクエストでこのトークンを提示することで、自分が認証済みであることを示す。

認証コントローラでは、実際にユーザー登録とログインのエンドポイント(APIの受付窓口)を実装する。ユーザー登録のエンドポイントでは、クライアントから送られてきたメールアドレスとパスワードを受け取り、パスワードをハッシュ化した後、新しいユーザーとしてデータベースに保存する処理を行う。ログインのエンドポイントでは、クライアントから送られてきたメールアドレスとパスワードを受け取り、データベースに登録されているユーザー情報と照合する。パスワードが一致すれば、認証サービスを使ってJWTを生成し、そのトークンをクライアントに返す。このトークンが、ユーザーが認証された証となる。

認証が完了したら、次に「認可」の仕組みを導入する。NestJSでは「Guards (ガード)」と呼ばれる機能を使って認可を実現する。Guardは、特定のエンドポイントへのアクセスを許可するかどうかを判断するためのクラスで、クライアントからのリクエストがコントローラに到達する前に、必要な条件を満たしているかをチェックする。

ここでは、ユーザーの「役割」に基づいてアクセスを制御する「ロールベースアクセス制御」を実装する。例えば、管理者にしかアクセスできない管理用APIがある場合、そのAPIにリクエストが来た際に、現在のユーザーが管理者ロールを持っているかをGuardが確認し、持っていなければアクセスを拒否するという仕組みだ。

この認可を実現するために、「RolesGuard」というカスタムGuardを作成する。このGuardは、特定のエンドポイントがどの役割のユーザーにアクセスを許可するかという情報(例えば「admin」ロールのみ)を取得し、現在リクエストを送っているユーザーがその役割を持っているかを検証する。もしユーザーが適切な役割を持っていなければ、リクエストの処理を停止し、エラーを返す。

また、各エンドポイントに必要な役割を簡単に指定できるようにするために、「Roles」というカスタムデコレータも作成する。このデコレータを使うと、例えば管理用のAPIを定義するコントローラのメソッドに「@Roles('admin')」と記述するだけで、「このメソッドは管理者ロールを持つユーザーのみがアクセスできる」という情報をGuardに伝えることができる。そして、「@UseGuards(RolesGuard)」と記述することで、そのGuardを適用し、リクエストが来るたびに役割のチェックが行われるようになる。これにより、アプリケーション内のさまざまな部分で柔軟にアクセス制御を実装できるようになる。

まとめると、JWTベースの認証システムを構築し、ユーザーの登録とログイン機能を実装することで、アプリケーションが「誰がアクセスしているか」を識別できるようになった。さらに、NestJSのGuard機能とロールベースアクセス制御を組み合わせることで、「誰が何ができるか」という認可の仕組みも確立した。これにより、セキュアで多機能なNestJSアプリケーションを開発するための強固な基盤が整ったと言えるだろう。この認証と認可の仕組みは、ユーザーのデータ保護とシステムの安定稼働のために不可欠な要素である。

関連コンテンツ

関連IT用語

関連ITニュース