GET と POST の違い
以前 github api を利用して,ユーザー情報を取得することをした.
その時にGET と POST の違いがよく分からなくなったから,理解しようと思う.
実体をつかむ
マスタリングTCP/IP入門編によると...
マスタリングTCP/IP入門編によると,HTTP通信の主なコマンドは次のようなものがある.
・OPTION・・・オプションの設定
・GET ・・・指定したURLのデータを取得
・HEAD ・・・メッセージヘッダだけを取得
・POST ・・・指定したURIにデータを登録
・PUT ・・・指定したURIにデータを保存
・DELETE ・・・指定したURIのデータを削除
・TRACE ・・・リクエストメッセージをクライアントに戻す
GETとPOSTくらいしか見たことなかった.
GETとPOSTはHTTPコマンドの一つであることがわかった.
HTTPリクエストの中身をちょっと見てみる.
これはとあるHTTPリクエストをdelveで覗いたものである(golangのnet/http.Requestのフォーマット).
(dlv) p req *net/http.Request { Method: "GET", URL: *net/url.URL { Scheme: "https", Opaque: "", User: *net/url.Userinfo nil, Host: "api.github.com", Path: "/user", RawPath: "", ForceQuery: false, RawQuery: "", Fragment: "",}, Proto: "HTTP/1.1", ProtoMajor: 1, ProtoMinor: 1, Header: net/http.Header [ "Accept": [ "application/json", ], "Authorization": [ "bearer *", ], ], Body: io.ReadCloser nil, GetBody: nil, ContentLength: 0, TransferEncoding: []string len: 0, cap: 0, nil, Close: false, Host: "api.github.com", Form: net/url.Values nil, PostForm: net/url.Values nil, MultipartForm: *mime/multipart.Form nil, Trailer: net/http.Header nil, RemoteAddr: "", RequestURI: "", TLS: *crypto/tls.ConnectionState nil, Cancel: <-chan struct {} {}, Response: *net/http.Response nil, ctx: context.Context(*context.emptyCtx) *0,}
MethodのところがGETになっているからGETコマンドを使い,HTTPリクエスト飛ばそうとしていることがわかる.
POSTだったらMethodのところをPOSTにするはず.
GET と POST の違い
https://wa3.i-3-i.info/diff7method.html
大方このサイトの通りの認識で自分も大体は納得していたのだが,
以前 github API を使用してユーザー情報を取得しようとした時に疑問が出た.
上記のサイトの通りだとaccess token などの機密情報はgetではなくpostで送るべきだと思われるが, developer.github.com
このサイトによると,access tokenをgetで送ることになっているのだ.
これではaccess tokenが漏洩してしまうのではと考えた.
しかし調べてみるとそれでも大丈夫な理由がわかった.
このサイトからするに,GETとPOSTで違うのはリクエストボディの部分であって,
GETのセキュリティを心配するのもボディの部分についてであることがわかった.
github のaccess tokenはボディではなくヘッダに載せているから,問題ないということだろう.
だったら何でもかんでもヘッダーで送れば良いのでは
そう思ったが,ヘッダーに乗せて送ることができる情報は決まっていて,
Authorizationヘッダーもしっかり用意されたものであった.
ここにヘッダー一覧があった.
後述
もやがはれた.