💨

面談対Next.jsの認証について

に公開

概要

質問 Next.jsの認証をどうするか?

回答 NextAuth.js を使うのがよいと考えています。

・OAuth(Google認証), Email, Credentialsに対応。
・App Router/Pages Router両対応
・SSR、API Routesとの連携が簡単
・セッション管理やCSRF対策がビルドイン
・独自JWT認証

CSRF(クロスサイト・リクエスト・フォージェリ)とは?

ログイン中のユーザーが意図しない操作を、第三者のWebサイト経由で行わされる攻撃手法。

銀行サイトを開き、セッションクッキーがセットされる。
詐欺サイトAを開くと、詐欺サイトAが銀行サイトのクッキーを使い、銀行サイトにログインした状態でアクセス可能。

SameSite対策を行うことで防ぐことで防ぐことが出来る。

その他の認証は?

基本的にはNextAuthがよいです。

例えば選択肢として以下があります。が高かったり、実装がう複雑になったりとあまり良い印象がありません。
サーバー側で認証を行いたい場合に利用を検討するサービスです。

AWS Cognite(AWSの他のサービスと連携しやすいが、そもそもNextAuthにCogniteプロバイダがある)
Firebase Authention(モバイルで既にFirebase Ausenticationを導入済み)

フロント側で工数をかけたくない場合、あまり詳しくありませんが、例えば
Auth0、Clerk.dev(Auth0のモダン版。表示uiも提供)
などが検討すべきサービスかなと感じています。

質問 JWTとセッションについて説明して

回答 基本的にはJWTを採用し、セキュリティに特に厳しい場面ではセッションを使うのが良いと考えています。

セキュリティが厳しい場面では、セッションのサーバー側でユーザーを強制ログアウトさせることが出来るというメリットがあるからです。

JWTでは一度発行されると、有効期限が切れるまで有効。
ただし、手動で強制ログアウトする仕組みを実装すればJWTでも同じことが可能。例えばDBに、強制ログアウトフラグを持たせ、このフラグがTrueの時ユーザーを強制的にログアウトさせる仕組みを作るなど。

セキュリティについて教えて。

基本的にプロバイダを勝代応することで基本的なセキュリティは問題ない。
所説あるがDBに平分でメールアドレスを保管するのは避けた方がいいと思っている。流出したとき、特定のメルアドを特定のサービスで使っているユーザーがいると、流出したデータが特定のサービスだと特定される。

Discussion