質問: jsonを返すAPIをつくっています。 APIの認証には、ヘッダにトークンを投げ、サーバーサイドのミドルウェアでトークンをチェックするという方式を取っています。 公開を想定したAPIなのですが、セキュリティについて分からないところがあります。 このAPIを自アプリケーション内で使用する際、アドミン用のトークンをヘッダに含めているのですが、それだとアドミン用のトークンを公開してしまうことになり、APIに認証を設ける意味がないと気づきました。 APIを公開する際には認証を必要としたいので、利用するユーザーそれぞれにAPIトークンを発行したいのですが、自アプリケーション内でAPIを安全に利用するにはどういう対策がありますでしょうか? 公開用とアドミン用のAPIを別に作成する必要があるのでしょうか?? ### 追記 追記: バックにはLaravel、フロントはReactを使っています。自作APIを利用するときは、基本的にはReactでAPIを叩いています。 追記: 皆様、有益な回答ありがとうございます。ググっても中々実装例が出てこなかったのでとても助かります。ただ、幅広い意見をお伺いしたいので今しばらく回答を募集中のままにさせていただきます。 ### 改めて質問内容を整理します。 Laravelでアプリケーションを開発しており(以下、Laravel Appとします。Wantedlyのようなサービスです。)、「**Laravel App内で使用すること**」と「**外部のクライアントに利用してもらうこと**(外部クライアントが開発している別のアプリケーション等に利用してもらう、など)」を目的としたAPIを作っています。 このAPIを利用するには、ヘッダにLaravel Appが発行するユーザー(Laravel Appの利用者かつ登録者)それぞれが保持するAPI Tokenを含めてPOSTすることでLaravel APPのミドルウェアが認証処理を行い、レスポンスを返してくれます。 外部のクラアイントがAPIを利用する分には、このAPI Tokenでの認証方法で良いと思います。(回答者の方のご指摘通り、Tokenのチェック方法に留意する点はまだありますが・・) しかし、この認証方法を設けてしまうと、Laravel App自身がAPIを使用することが難しくなってしまいます。 例えば、Laravel Appが自身がAPIを利用するためのアドミン用のAPI Tokenを用意しても、ヘッダ情報にAPI Tokenを含める必要があるため、Larave Appを利用する全てのユーザーにアドミン用のAPI Tokenが公開されてしまいます。 上記の利用目的において、APIの認証方法はどのようにすべきでしょうか? ### 考えている方法 * 公開用と内部で使用する用でAPIを分ける。内部で使用する用は非公開にする。 * アドミン用のAPI Tokenを利用せず、ユーザー(Laravel Appの利用者かつ登録者)のAPI Tokenを利用させる。本来、API Tokenは外部の別のアプリケーションの開発等に使用してもらうためのものを想定していたが、Laravel Appを利用する際も使用する仕様にする。 API TokenはLaravel Appに登録した時に自動で発行、いつでもリフレッシュ可能なものとする。
回答: mit0223さんの回答が解決方法に近かったのですが、自分なりに解釈して解決したので、こちらに解決方法を投稿します。 アプリケーション内部でのapiの利用方法については、ログイン手続きと同じCookieを利用した認証方法を取りました。 Laravelのログインチェックのやり方に沿って、ミドルウェア内でログインチェックを行うようにしました。 外部からの利用に関しては、API Tokenをヘッダに含める方式を継続して採用することにしました。こちらは安全性をより高める為の実装(署名の工夫など)も検討してみようと思います。 なお、API Tokenによる認証もミドルウェアで行うように実装しました。 従ってミドルウェアではCookie認証とAPI Tokenによる認証のどちらを利用するかの条件分岐を含くめました。 結果的に内部からAPIを叩く必要がなくなりました。 よくよく考えれば単純でシンプルな解決方法でした笑 APIを叩くことにとらわれていましたw