從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的操作, 存於本地電腦磁碟中。
別扯其他的。