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

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

ただいまの
回答率

89.21%

ツイキャスAPIで発行されたトークンの管理方法とセキュリティ

解決済

回答 1

投稿

  • 評価
  • クリップ 3
  • VIEW 1,970

kurosuke___

score 213

現在ツイキャスAPIを使用したSPAのウェブサービスを開発しています。

ツイキャスAPIの使用には、ほとんどアクセストークンが必要で、ユーザーをツイキャスの許諾画面に飛ばして許可して貰う必要があります。
流れはこのような感じです。
(デプロイするドメインはLet's EncryptでSSL化してあります)

1.デベロッパーはアプリ登録をしてCLIENT_IDとCLIENT_SECRETを取得する。(このときにリダイレクトURLを指定する)
2.ユーザーにはツイキャス指定のURLへブラウザからアクセスさせて、まずはCODE(長い文字列)を取得する。
3.CLIENT_ID、CLIENT_SECRET、CODE、リダイレクトURLをHTTPヘッダに詰めてアクセストークン取得用URLにアクセス
4.アクセストークンが返るので、それを使用して各種APIを叩けるようになる

2の段階で、ユーザーにブラウザから許諾画面に飛んでもらうためにハイパーリンクを置きますが、CLIENT_IDがGETパラメータで必要なので、CLIENT_IDはクライアント側に平文で入ってます。

3ではCLIENT_SECRETを使う必要があるのでサーバーサイドでのアクセスになります。

4でアクセストークンが取得できるわけですが、このタイミングでuuidを生成してトークンとペアにしてデータベースに保存します。

そしてuuidをクライアントへ返し、LocalStorageに保存。

サイトにアクセスした際にuuidが保存されていればLocalStorageのuuidを使ってサーバー側でトークンを読み出して返します。
SPAなのでそのままクライアント側にアクセストークンを保持して、クライアント側からAPIを叩きます。
(LocalStorageを消されたらサーバーに到達できないトークンが残るので気持ち悪い・・・)

この手順を踏めばクライアント側にアクセストークンが載るのですが、これはセキュリティ的に大丈夫でしょうか?

また、全体的に見てセキュリティがまずいところがあれば指摘していただけると助かります。

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

気になったところを3点。

 1. サーバ側でトークンを保持する期間

この直後に一度読み出しを行ったトークンはサーバから削除した方が良いと思います。

LocalStorageのuuidを使ってサーバー側でトークンを読み出して返します

2とも関連しますが、サーバにはなるべくユーザ毎のトークンを保管しないようにしておけば、サーバ側のリスクは下げられます。

 2. サーバ側の堅牢化

uuidなのでブルートフォースによるトークンの窃盗は難しいでしょうが、それでも通常のログインページと同様の、ブルートフォース対策は必要だと思います。

 3. クライアント側の堅牢化

一度取得したトークンをどのように守るかが最終的な課題ですね。逆にクライアントには何も持たせずにサーバが代理リクエストを行うアーキテクチャに変更して、SPAでは毎回認証を必須化するという方向でも良いかもしれません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/08 20:30

    あと、1に関連して各トークンに保存期間を定めて定期的に期限切れのトークンを削除する、2に関連して各トークンを生成したクライアントのIPを覚えておいて異なるIPからの読み出しを制限する(弊害あり)、です。

    キャンセル

  • 2018/04/11 16:32

    回答ありがとうございます!

    もしかしたら理解ができていないかもしれませんので、もうすこし質問よろしいでしょうか。

    ・IPをもとにしたとき弊害があるというのは、相手側のグローバルIPが変わってしまう可能性があるからでしょうか?

    ・サーバー側に保存されるトークンを例えば1日ごとに削除して、次のアクセス時には再度認証してもらうということでしょうか?
    堅牢なセキュリティのためにはユーザーの手間が増えるのも致し方ないのでしょうかねぇ・・・


    あと3に関して、サーバー側でAPIのリクエストを代行する形にしました。ありがとうございます。

    キャンセル

  • 2018/04/11 19:21

    YesとYesです。3に関してはやはりそういう方向性で落ち着いたんですね。

    キャンセル

  • 2018/04/12 00:09

    わかりました!ありがとうございました!

    キャンセル

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

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