まったりするmatayu

ツイートにゴミがついた感じのブログ

GET と POST の違い

以前 github api を利用して,ユーザー情報を取得することをした.

mattari-matayu.hatenablog.com

その時にGET と POST の違いがよく分からなくなったから,理解しようと思う.

実体をつかむ

マスタリングTCP/IP入門編によると...

www.amazon.co.jp

マスタリング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が漏洩してしまうのではと考えた.

しかし調べてみるとそれでも大丈夫な理由がわかった.

qiita.com

このサイトからするに,GETとPOSTで違うのはリクエストボディの部分であって,

GETのセキュリティを心配するのもボディの部分についてであることがわかった.

githubaccess tokenはボディではなくヘッダに載せているから,問題ないということだろう.

だったら何でもかんでもヘッダーで送れば良いのでは

そう思ったが,ヘッダーに乗せて送ることができる情報は決まっていて,

Authorizationヘッダーもしっかり用意されたものであった.

ここにヘッダー一覧があった.

developer.mozilla.org

後述

もやがはれた.