質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

2回答

1873閲覧

掲示板をつくっています。認証機能の作り方についてわからない事があるので、ご教授いただけると助かります。

kwm1910

総合スコア2

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

1クリップ

投稿2021/06/02 12:41

つくっている掲示板について

現在、掲示板を作っています。クライアントサイドは Next.js で作り、サーバーサイドは Express で作ります。また、クライアントとサーバー間は GraphQL をつかって通信します。

そして、認証機能を、以下のようにして実現しようとしています。

  1. ユーザー登録するときに、サーバーでトークンを作成する。そのトークンは、DB の Users テーブルにある authToken 列で保存しておく。また、クライアントの localStorage にも保存しておく。
  2. 以降、クライアントがサーバーにリクエストするたび、localStorage に保存されたトークンを、HTTP の authorization ヘッダーに設定する。
  3. サーバー側は、リクエストをうけたら、authorization ヘッダーに設定されている token と一致する行を DB で検索する。行が見つかれば認証成功。

イメージ説明

質問

質問1: 時間が経過したら自動ログアウトする機能(セッションタイムアウト?)は実装しない気でいるのですが、何か問題がありますでしょうか?
質問2: ユーザー登録時に作成したトークンは、以降、変更しない気でいるのですが、何か問題がありますでしょうか?

そのほかにも、「セキュリティ的にそれだめだろ。。。」みたいなご指摘があれば、ご教授していただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問にある機能は「セッション管理機能」と呼ばれるものです。
一般的に自作のハードルはそこそこ高いです。
*網羅的な安全対策を行うのに、広い範囲の知識が必要であるため
素直にフレームワークに実装されているモノや適当なライブラリを使うのが適切です。

参考:
安全なウェブサイトの作り方 - 1.4 セッション管理の不備
ログアウト機能の目的と実現方法 - 徳丸浩の日記
セッションの安全な管理方法について - teratail // 回答のコメント欄が重要です。
JWTなどのTokenをlocalstrage(HTML5の)に保管することについて - teratail//識者に回答をねだりましたw

この辺の基礎学習は重要なので、体系的な学習をすることをオススメします。

投稿2021/06/02 21:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/06/02 21:52

どうしても token を自作したいのであれば、こちらも参考になると覆います。 https://blog.ohgaki.net/advanced-csrf-token-by-hmac-hash php ベースで書かれさらに CSRF 対策用のモノですが、前半部分が需要です。
kwm1910

2021/06/03 02:50

回答ありがとうございました!
guest

0

概要

あくまでも私の見解ですが、「ログインの度にトークンを生成し、更にトークンに対して有効期限を設定するのが良い」と考えています。
なので質問1,2共に問題だと私は考えます。

詳細

我々の端末は、常に様々な脅威にさらされています。
ウイルス・マルウェア・端末盗難などなど
あなたが作られている掲示板が、どの程度のセキュリティを担保しないといけないかはわかりませんが、トークンが固定でかつ有効期限がないならば、一度そのトークンを盗み出せば、攻撃者はパスワードの変更をされようが問題なく、永久にアクセスし続けることができます。

有効期限を設定することで、その期間を短縮することができます。

しかしただ有効期限を設定するだけでは、ログインする度に有効期限が延長されることになるでしょう。
そうすると盗まれたトークンは利用者がログインをする限り、有効になってしまいます。

なのでログインの度にトークンを生成し、各々に有効期限を設定することで、問題をある程度解消することができます。

もし余力があれば、トークンを無効化することができると更に良いですね。
例えばパスワード変更のタイミングなど。無効化するタイミングは利用者に委ねても良いでしょう。
よくあるものだと「全ての端末からログアウト」のようなボタンがあったり、端末単位での無効化ができるパターンなど。

(セキュリティの専門家はまた別の意見をお持ちかもしれません)

投稿2021/06/02 17:01

lohn

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kwm1910

2021/06/03 02:49

回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問