私も今現在APIの認証をどうしようか思案中ですので、回答とまでは言えませんが書いてみます。
まず通常「Web API」と言われるものではCookieは使わないと思います。
なぜならばCookieとはオリジン単位のものだからです。つまりAPIの利用者であるクライアントと、APIが同じオリジンでなければなりません。もちろん、SSKDsなAPIの(既知の開発者向け、もっと狭く言えば自分のWebアプリでサーバ側をWeb API、クライアントをAngularJSのようなものを使って構築するような)場合にはCookieも利用できますが、その辺はアプリの構成や運用形態次第でしょうか。
Cookieが利用できるならばtokenを使う必要はありません。Cookieに色々詰め込めます。ただし、クライアント側での改ざんを防止する必要があるので、Railsではcookies.signed
を使うことになるでしょうか。
クライアントとAPIが別オリジンの場合には何かしらのtokenを使う必要があると思います。
そして私は**JSON Web Token(JWT)**でいいのでは、と考えています。厳密にいうとJWT形式のJWSというのでしょうか?Rubyならばgemもあります。
このトークンをクエリパラメータ、HTTPヘッダ、x-www-form-urlencodedなデータいずれかとしてクライアントにリクエスト時に付与してもらうのがいいのかと思います。
私はさらに一歩進んでOAuth2.0のアクセストークンとしてJWTを使おうかと考えています。理由は色々ありますが、標準化されたプロトコルでやりとりした方がいいかなあ、とそのくらいの考えです。
そしてCookieやトークンの盗難についてですが、これはそれらに有効期限を設けるくらいしか対策がないかと思います。CookieもJWTもOAuth2.0も有効期限が設定できます。そして有効期限が切れたら認証(ログイン)してトークンを再発行するという感じになると思います。
「期限きれるまでは盗まれても使えちゃうし、再ログインなんてクールじゃない。」等あるかと思いますが、どうなんでしょう。認証時に接続元をIPアドレスなりで判定して期限内に別アドレスからアクセスがあった場合にトークンを無効にする、とかもできると思いますがそこまで手間をかけるのだろうかという感じです。
私もエキスパートの方々のご意見をぜひ伺ってみたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。