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

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

ただいまの
回答率

88.05%

自前で認証システムを作るのは危険なのでしょうか?

受付中

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 719

score 38

認証システムはよくライブラリや外部サービスを使っているケースが多いように感じます。
例えばRubyのdevise、Auth0など

しかしシンプルな認証システムを自前で作成することは危険なのでしょうか?

例えばですが、

  • メールアドレスとパスワードでログイン
  • パスワードはハッシュ化して保存し、ハッシュ値が同じであれば認証成功とみなす
  • 認証成功後はブラウザのcookieに認証情報を暗号化したものを保存し、以後そのcookieをみて認証済みかどうか判断する

上記のような一般的な認証システムを実装することはそこまで大きな労力には感じませんが、それをすることで冒頭に挙げたようなライブラリや外部サービスを使うより危険なことがあるのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+5

上記のような一般的な認証システムを実装することはそこまで大きな労力には感じませんが、それをすることで冒頭に挙げたようなライブラリや外部サービスを使うより危険なことがあるのでしょうか?

要件定義や設計が完了しているのであれば、確かに労力はそれほどかからないと思います。
が、認証システム(というか、会員管理システム)は適切に設計することすら大きな労力を伴います。

システムのセキュリティ精度を一定以上に保つためには脅威分析を行わねばならず、脅威分析を行うには、脅威自体を網羅的に知る必要がありますが、この「網羅的に脅威を知る(洗い出す)」という行為が非常にハードルが高いです。
情報の性質として仕方ないのですが、クローズドな情報として扱われるケースが多く、この部分において、セキュリティの専門家と一般エンジニアの持つ情報量の乖離は絶望的です。。。

シェアの大きなフレームワークや有名ライブラリでは、この部分を集合知で乗り切ろうとしています。
コードをオープンにすることで、クローズドな情報も持った方からも実装の提案を受けやすくし、「それなりに安全なシステム」として成立できる程度を結果として保てるようになります。

ごく一般論としてですが、集合知によってなされたコード群の背景にある要件は、一般システムの持つ要件を包括しています。そのため、(ホントに要件を満たしているかの確認は必要ですが)自前で実装するよりもはるかに安全に使用することが可能です。

個人的には、フレームワークやライブラリが、その実装の背景にある要件や設計を明文化していないケースが多いのが不満ですが、それでも実利を考えると、フレームワークの使用やライブラリの使用をオススメします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 16:53 編集

    ただ、フレームワークやライブラリの使用方法を間違って、逆に穴をあけてしまうってケースもあるんですよね。。。重要部分はちゃんと一度は理解しておきたいですね。

    キャンセル

+2

危険になるかどうかは質問者さんの技量次第です。
例えば、攻撃方法や防御方法を熟知した上で作成するなら、既存のより圧倒的に柔軟性の高いのができると思いますが、それらを持ち合わせていない・自信がないなら避けるのが無難だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 14:25

    ごく一般論で、以下が問題となります。

    > メールアドレスとパスワードでログイン

    昨今の傾向として、無対策だと辞書攻撃に弱いです。

    > パスワードはハッシュ化して保存し、ハッシュ値が同じであれば認証成功とみなす

    ハッシュ化だけであれば、漏洩時にレインボーなやつでサクッと解析されます。

    > 認証成功後はブラウザのcookieに認証情報を暗号化したものを保存し、以後そのcookieをみて認証済みかどうか判断する

    cookie に情報を持たせた場合、暗号化手順によっては解析可能です。
    これは、session id だった場合も同様です。

    キャンセル

  • 2020/08/20 14:31

    詳しくありがとうございます。
    確かに解析された場合の対策、もしくは認証突破後のプラスαが必要そうですね

    キャンセル

  • 2020/08/20 15:27

    あと、パスワード暗号化 + アクセストークンを生成するのがトレンドになっていると思います。
    フロントエンドフレームワークの普及で、APIを使用する機会が増えているため、
    ログイン後の、各API実行は、ハッシュ認証を必ず行うようにする方式です。
    te2jiさんの仰るものプラス、ユーザーに入力させるパスワードはログイン時のみで、その後は発行されたアクセストークンによって認証かける方式です。

    キャンセル

+2

一昔前では、自前で作るのが当たり前だったわけですから、
アプリケーションを作る事自体はそんなにハードルは高くないでしょう。
ノウハウなどを勉強するための情報も、十分にあると思います。
どうしても不安なら、セキュリティに強い会社に相談してもいいでしょうし。

結局、運営側で一番嫌な事ってのは、「個人情報を自分たちの管理下で持つ」ってところなんですよね。
クレデンシャルの情報もそうですし、カード番号などもなるべく持ちたくありません。
アプリがセキュアでも内部の人間が業者に売り飛ばすかもしれませんしね。
そういう意味でも、外部に委譲した方が楽な事が多いってだけです。

あと、TwitterやFacebookなどの有名なサービスでのOAuthが用意されていると、
ユーザーの会員登録へのハードルが下がるという効果もあるかもしれませんね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

認証成功後はブラウザのcookieに認証情報を暗号化したものを保存し、以後そのcookieをみて認証済みかどうか判断する

これだけだと、cookieを「盗まれる」ような事があると不正ログインに使用される事がありますね。
だから、その認証を失効させる手段が必要な訳です。
(OAuthなんか使ってるとそういうページありますよね。)

で、cookieが盗まれる、というのはそのシステム側だけでなく、ブラウザ側のバグにより漏れる事があったりもするので、そういったシーケンスもろもろ合わせて使用する(つまりは、〇〇ライブラリを使う)というような話になる訳です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/20 14:25

    >認証を失効させる手段
    >ブラウザ側のバグにより漏れる事があったりもする

    ありがとうございます。
    確かに敏感にそこに対応していくには専任の人間がいないと厳しい印象ですね。

    キャンセル

0

実装上の問題もありえますが、設計上の問題が大きそうですね。
パスワード保護だけとっても、単に「ハッシュで保存すればよい」というものではありません。このテーマでYouTube動画を作ったものがありますので、よろしければどうぞ。3本でトータル35分くらいかかります。

ウェブサイトにおけるパスワード保護の重用性 - YouTube

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る