1. 程式人生 > >從go服務端"設定cookie"來看cookie的本質

從go服務端"設定cookie"來看cookie的本質

       cookie到底是什麼, 很多地方越說越亂,玄乎其玄, 其實,很簡單, 一起來看看。

       go 服務端的程式碼為:

package main

import "net/http"

func main()  {
   http.HandleFunc("/writecookie", WriteCookie)
   http.ListenAndServe("localhost:8080", nil)
}

func WriteCookie(w http.ResponseWriter, r *http.Request)  {
   cookie := http.Cookie{Name:"name", Value:"Shimin Li", Path:"/", MaxAge:60}
   http.SetCookie(w, &cookie)
   w.Write([]byte("write cookie ok"))
}

        go run s.go跑起來。

       在chrome瀏覽器中執行: http://localhost:8080/writecookie,  觸發go服務執行設定cookie的動作, 瀏覽器收到這個資訊後, 真正執行設定cookie,  在chrome中可查(chrome://settings/content/cookies目錄中的localhost域名中查), 如下:

        可以看到,過期時間是60s, 60s後再次查的時候, 就沒有name對應的cookie項了。

        我們等cookie過期消失, 然後再來玩抓包。 

        好,現在沒有name對應的cookie了, 我們連續兩次執行:http://localhost:8080/writecookie, 服務端tcpdump抓包,兩次的請求和響應依次如下:

GET /writecookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: xxxxxx
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
HTTP/1.1 200 OK
Set-Cookie: name="Shimin Li"; Path=/; Max-Age=60
Date: Sat, 15 Sep 2018 13:41:17 GMT
Content-Length: 15
Content-Type: text/plain; charset=utf-8
GET /writecookie HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: xxxxxx
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: name="Shimin Li"
HTTP/1.1 200 OK
Set-Cookie: name="Shimin Li"; Path=/; Max-Age=60
Date: Sat, 15 Sep 2018 13:41:21 GMT
Content-Length: 15
Content-Type: text/plain; charset=utf-8

       可以看到,第一次請求時, 瀏覽器發出的請求中不帶cookie, 因為瀏覽器壓根就沒有這項cookie, 在go服務端的回包中攜帶了Set-Cookie首部, 瀏覽器收到這個資訊後,將其寫入到瀏覽器本地, 形成cookie.

       第二次請求時(因cookie的過期時間設定為了60s, 故必須在60s內發起第二次請求), 此時, 瀏覽器的http請求中自動攜帶了cookie資訊,go服務端也能收到這個資訊。

       由此可見, cookie不過是瀏覽器端的一個環境變數而已, 僅此而已。cookie值存在於瀏覽器所在的本地電腦中。 而所謂的服務端設定cookie, 其實是服務端給瀏覽器傳送對應的設定cookie資訊, 由瀏覽器來真正執行設定cookie的操作, 存於本地電腦磁碟中。

       別扯其他的。