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

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

新規登録して質問してみよう
ただいま回答率
85.49%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4843閲覧

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

kurosuke___

総合スコア217

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

3クリップ

投稿2018/04/07 14:39

現在ツイキャス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を消されたらサーバーに到達できないトークンが残るので気持ち悪い・・・)

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

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

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

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

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

2. サーバ側の堅牢化

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

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

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

投稿2018/04/08 11:16

YouheiSakurai

総合スコア6142

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

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

YouheiSakurai

2018/04/08 11:30

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

2018/04/11 07:32

回答ありがとうございます! もしかしたら理解ができていないかもしれませんので、もうすこし質問よろしいでしょうか。 ・IPをもとにしたとき弊害があるというのは、相手側のグローバルIPが変わってしまう可能性があるからでしょうか? ・サーバー側に保存されるトークンを例えば1日ごとに削除して、次のアクセス時には再度認証してもらうということでしょうか? 堅牢なセキュリティのためにはユーザーの手間が増えるのも致し方ないのでしょうかねぇ・・・ あと3に関して、サーバー側でAPIのリクエストを代行する形にしました。ありがとうございます。
YouheiSakurai

2018/04/11 10:21

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

2018/04/11 15:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問