2013-04-16 28 views
5

私はRESTサービスを開発中です。これにより、ユーザーは請求書(請求書番号と請求書)に表示されるいくつかの情報に基づいてリスティングを請求することができます。REST WebサービスでのPOSTとGETとの比較

GETの使用時期とPOSTの使用時期については、無数の記事とStack Overflowの質問を読んだことがあります。全体として、共通のコンセンサスは、冪等の操作にGETを使用し、サーバー側で何かを作成する操作にPOSTを使用する必要があるということです。しかし、この記事:

http://blog.teamtreehouse.com/the-definitive-guide-to-get-vs-post

は、単にので、私はの身元を確認するための仕組みとして、情報のこれら2枚を使用しているという事実を、私はこの特定のシナリオのためのGETを使用して質問させていますユーザー。私はこの特定のメソッド呼び出しを使用してサーバー上の何かを更新していませんが、必ずしもURLの情報を公開する必要はありません。

これは内部Webサービスで、サービスを呼び出すフロントエンドだけが公開されているため、ユーザーのブラウザ履歴に表示されるURLについて心配する必要はありません。私の唯一の懸念は、誰かがサーバログアクセスを取得する可能性が低い場合です。その場合、私はより大きな問題を抱えています。

セキュリティ上の理由から私はPOSTの方に傾いています。しかし、GETは、要求が冪等であるという事実のため正しい方法のように感じます。この場合に推奨される方法は何ですか?

答えて

5

POSTとは独立して、私はあなたのセキュリティを郵便番号と請求書番号のような単純なものにすることを推奨しません。私は、請求書番号が連続している(または近くにある)という事実に賭けるでしょう。その周りには多くの郵便番号がありません - あなたのリストには完全にアクセスできます。

(通常はHTTPヘッダーにある)別の認証方法を使用している場合、URLは請求書番号を持っているかどうかは関係ありません。GETも同様です。

もしあなたがそうでないなら、POSTは機密コンテンツを公開するという意味でGETほど悪くないと思います。

+0

感謝。これは、POSTが冪等の要求に対して間違っているとはいえ、トピックに関する私の考えを確認します。より安全な検証方法を使用することができると私は同意しますが、これはビジネス要件であり、別の議論の話題になると思います。 – Luke

0

POSTとGETの間に実際に追加されたセキュリティはありません。確かに、要求はURLにはありませんが、ここではRESTであり、URLは人間には見えません。

+0

正しい。どちらのメソッドにも固有のセキュリティはなく、POSTパラメータはログファイルには表示されないことを理解しています。あなたが言ったように、私はそれがREST要求の時にそれほど重要ではないと思います。 – Luke

+0

WebサーバーがURLをログに記録し、場所へのデータリークが意図されていないため、POSTがより安全であるという主張をする人もいます。私は実際にこれが実用的な問題だとは思わないが、理論はそこにある。 – Lee

+0

@LeeWhitney良い点。まあ、どんな場合でも、あなたは間違いなくGETでパスワードを送るべきではありません。 :-) –

0

あなたの質問は、いくつかの悪い仮定から始まります。まず、GETは、古い冪等の操作だけではなく、サーバからのリソースのためのものです。それはちょうどそうすることが起こるは、副作用がない必要があります。第2に、GET要求がサーバーにデータを送信する唯一の方法ではなく、少なくともGET要求のペイロードを使用できます(少なくともHTTPに関する限り、一部の実装は悪いですし、これをサポートしていません。ハードそれを作ります)。第三に、指摘したように、アクセスを保護するためにいくつかのひどいデータフィールドを選択しています。最後に、プレーンテキストプロトコルを使用しているので、どちらの方法も実際には提供していないし、セキュリティを強化しています。

あなたがしていることを最もよく表している動詞を使用する必要があります。サーバーから情報が得られているので、GETを使用してください。基本的なHTTPS暗号化などの適切なセキュリティを使用します。あなたはURLまでこれらのフィールド「目詰まり」を避けたい場合は、リクエストのペイロードにデータを送信することができ、のようなもの:返信用

GET /listings HTTP/1.1 
Content-Type = application/json 

{ "zip"  : "IN0N0USZ1PC0D35", 
    "invoice" : "54859081145" } 
関連する問題