前回の記事で、ローカル環境にRESTful APIを作成、サーバーからデータを取得する例を紹介しましたが、本作業でユーザーの個人情報が入ったデータのAPIをとりあつかうとしたらどうでしょう?そのAPIは誰でもアクセス可能になり、機密情報が漏洩するリスクがあります。このリスクを回避するためには、認証(ユーザーが誰か)と認可(ゆーざーが情報にアクセスする権限はあるか)をチェックし、問題がなければアクセスできるというセキュリティ対策が重要です。
個人情報を扱う場合、認証の導入は非常に重要です。適切な認証を行うことで、不正なアクセスを防ぎ、個人情報を守ることができます。認証のプロセスを行うためには、以下の方法があります。
■ セッションベースの認証
サーバーがセッションIDを管理し、そのセッションIDでユーザーを認証します。
クッキーにセッションIDを保存し、各リクエストより送信されるセッションIDでユーザーを認証します。
■ トークンベースの認証
JSONWebTokenを使用してトークンを発行して、発行されたトークンを利用してユーザーを認証します。トークンはクライアント側(フロントエンド)に保存され、サーバー(バックエンド)へ送信されます。
トークンベースの認証の方が、セッション管理がサーバー側に保存されないため、モバイルアプリなどでも使いやすく、主流の方法です。
JWTを使った認証は、ユーザーの認証情報をトークンとして発行して、クライアント側(フロントエンド)で発行されたトークンを保持、APIにリクエストを送る際に発行されたトークンをつかって認証確認を行う方法です。例としてユーザーがログインする際、ユーザー名・パスワードを送信されてからどのようにして認証を行うのかJWT認証の流れを記載します。
サーバー側(Node.js)でそのユーザー情報を確認し、リクエストが正しければJWTを発行します。
クライアント(ブラウザやアプリ)は、JWTをローカルストレージやセッションストレージに保存します。
クライアント(ブラウザやアプリ)はAPIを呼び出す際、リクエストの情報にJWTを含めて送信。
サーバー側(Node.js)はリクエストを受け取る際JWTを検証し、その情報に基づいてリクエストを許可。
この方法によりAPIへのアクセスを制限し、適切なユーザーのみがアクセスできるようにできます。
認可は認証と異なり、そのユーザーが何をできるかを決定するプロセスです。例えば、ログインしたユーザーが自分のファイルデータにはアクセスできるが、他のユーザーのファイルデータにはアクセスできないように制御するのが認可です。基本的認可の処理は、
ユーザーがどのデータにアクセスする権限を持っているかをチェック。
認証されたらリクエストを処理する際に、ユーザーがデータにアクセスする権限を持っているかを確認します。
■ アクセス権限の確認
ユーザーがリクエストしているリソース(例としてログイン後のユーザーデータ)にアクセスする権限があるかを確認します。※ユーザーIDが認証されたユーザーIDと一致するかをチェック。
■ リソースへの所有者確認
認証されたユーザーのIDとAPIリクエストのURLパラメータで渡されたユーザーIDが一致している場合のみ、そのユーザーは自分のデータにアクセスしていることが確認できます。
■ 役割ベースの認可
ユーザーの役割(admin, manager, user)に基づいてアクセスを制限。役割ベースやリソースベースの認可と様々な認可方法を組み合わせることで、柔軟なアクセス制御を実現できます。
これら対応で、悪意のあるユーザーや不正なリクエストがデータにアクセスできないようにすることができます。サーバー(バックエンド)は、クライアントからのリクエストを受けて、データを処理したり、データベースとやりとりしたりと個人情報を扱う門番の役割です。JSON Web Tokens (JWT) を生成、検証、デコードするためのライブラリjsonwebtokenやパスワードのハッシュ化と検証を行うためのライブラリbcryptjsを使って、トークンを検証して認証されたユーザーにのみデータを返す、認可(Authorization)と認証(Authentication)強化にて不正なアクセスを防ぎ、適切なユーザーのみがアクセスできる安全な処理を構築しましょう。
今回は、APIエンドポイントの保護について簡単ではありますが紹介をさせていただきました。サーバーサイドは大変おくが深いですがセキュリティの入り口の基本は本記事がベースとなります。個人情報を扱うアプリを構築する場合は、サーバーサイドとフロントエンドで、時間をかけて適切な安全な構築ができているか検証・テストを繰り返す事も重要です。
以上となります。できる限りわかりやすく伝えようとしても書くのは難しいです。
コードや記事の書き方について気になるところがあれば、アドバイスいただけると嬉しいです。
要件定義からブラッシュアップ/実装運用まで一貫して担当。また内部対策を中心に、GTM・GA4・Looker Studioと分析・改善案の策定も進めています。北緯43度マルチエンジニア