目錄
2、session
3、總結:
一、cookie 和 session
cookie 和 session 都是一塊存盤區域,主要是給服務端用的(當然客戶端可以使用 cookie),作用:(1)認證客戶端(2)區別存取與客戶端相關的資料,
1、cookie
(1)cookie 是什么
存盤在客戶端,即在客戶端/瀏覽器端劃分出的一塊存盤區,存盤的是一條一條的記錄,每條記錄由多個 k-v 鍵值對組成,其中一個為主體,即資料,其他為針對該條記錄的配置,如過期時間、http-only等,
每次請求時,請求頭 Cookie 欄位將復制 cookie 存盤的 記錄,
(2)存盤權限
客戶端和服務端都可以向 cookie 中存盤記錄,
客戶端自然可以存取 cookie 中的記錄,
服務端通過在 response 中設定 "Set-Cookie" 欄位來向客戶端追加/設定 cookie,
(3)cookie 的作用
a. 認證
客戶端在登錄成功后,服務端生成令牌,將令牌存盤,并將 令牌 放在 cookie 中(或回傳令牌后由客戶端放入 cookie 中),在之后的請求中,服務端每次從 Cookie 中取令牌,驗證令牌是否存盤,
cookie 存令牌有 csrf、xss 攻擊風險,是不安全的,安全的做法是:
客戶端在登錄成功后,服務端生成令牌,將令牌存盤,并將 令牌 回傳給 客戶端(不存入 cookie),在之后的請求中,客戶端將令牌放入 Header 中(設定一個新欄位如X-Token),服務端每次從 Header 中取令牌,驗證令牌是否存盤,
b. 區分客戶端,存盤與客戶端相關的資料
資料在客戶端存盤,減輕了服務器的資料存盤壓力,尤其是客戶端比較多的情況,如CC攻擊,
資料靠客戶端存盤,敏感資料不便存盤,即便加密也不是很安全,
每次請求都需要攜帶 cookie 的資料,加大了網路傳輸的壓力,只適應于小資料量,
2、session
(1)session 是什么
存盤在服務端,即在服務端劃分出的一塊存盤區域,但它并沒有規定具體存盤在哪里,可以是記憶體、檔案、快取中間件、資料庫等,
session 相對于 cookie,只是把 資料存盤 從 客戶端 轉移到了 服務端,相當于 在服務端 為每個客戶端 開辟了一塊 專用存盤區,
對于每個客戶端,生成一個 sessionid 存入 cookie,這樣每次請求時,通過 Cookie 欄位中的 sessionid 即可索引到對應的 session 區域,
(2)存盤權限
session 是服務端自維護的,只有服務端才能將資料存入 session,
對于客戶端來說,只能看到 cookie 中有一條 sessionid 的記錄,看不到 session 中存盤的資料,
(3)session 的作用
a. 認證
客戶端在登錄成功后,服務端生成令牌,將令牌存入 session,并將 令牌 放在 cookie 中(或回傳令牌后由客戶端放入 cookie 中),在之后的請求中,服務端每次從 Cookie 中取令牌,驗證令牌是否存盤在 session 中,
cookie 存令牌有 csrf、xss 攻擊風險,是不安全的,安全的做法是:
客戶端在登錄成功后,服務端生成令牌,將令牌存入 session,并將 令牌 回傳給 客戶端(不存入 cookie),在之后的請求中,客戶端將令牌放入 Header 中(設定一個新欄位如X-Token),服務端每次從 Header 中取令牌,驗證令牌是否存盤在 session 中,
b. 區分客戶端,存盤與客戶端相關的資料
資料在服務端存盤,資料安全,減輕了資料傳輸壓力,且可以存盤的資料量大,
資料在服務端存盤,客戶端比較多,資料量比較大的情況下占用的存盤多,
3、總結:
(1)cookie 和 session 都是一塊存盤區域,主要是給服務端用的(當然客戶端可以使用 cookie),作用:區別存取與客戶端相關的資料,
(2)cookie 存盤在客戶端,每次請求時請求頭攜帶 Cookie,這樣服務端就能獲取客戶端資料,
(3)session 存盤在服務端,只是將 sessionid 存盤在 客戶端(默認存 cookie,也可以不存 cookie),服務端拿到每次請求的 sessionid,就可以索引到對應的 session 存盤區,獲取客戶端資料,
(4)session 相對于 cookie,只是將 客戶端資料存盤 由 客戶端 轉移到了 服務端,相當于服務端為每個客戶端開辟了一塊專用存盤區,cookie 存盤小,可以存盤不敏感的資訊,session 存盤大,比較安全,
(5)出于安全考慮,cookie 不存令牌,容易遭到 csrf、xss 攻擊,
二、cookie 設定
1、引數設定
//func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
var (
name = "user"
value = form.User
maxAge = 10 //s
path = "/"
domain = ""
secure = true
httpOnly = true
)
c.SetCookie(name, value, maxAge, path, domain, secure, httpOnly)
// MaxAge=0 means no 'Max-Age' attribute specified.
// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
// MaxAge>0 means Max-Age attribute present and given in seconds
//func (c *Context) Cookie(name string) (string, error)
value, _ := c.Cookie("key")

2、引數簡介
(1)Max-Age
過期: >0 >0
不過期:session =0
洗掉 - <0
(2)HttpOnly
HttpOnly 是加在 cookie 記錄上的一個標志,該標識告訴瀏覽器不要將 cookie 展示給客戶端,設定該選項可以有效避免 XSS 攻擊(攻擊者可通過 XSS 腳本獲取 cookie 內容),
當設定 HttpOnly 標識后,瀏覽器就會知道到這是特殊的 cookie,只能由服務器檢索到,所有來自客戶端腳本的訪問都會被禁止,前提是使用新版的瀏覽器(>= IE6),
(3)Security
Security 標志會強制瀏覽器通過 HTTPS 等加密通道發送 cookie,這會阻止竊聽,尤其是當 HTTPS 連接通過 SSLStrip 等工具降級為 HTTP 時,
3、Cookie 與跨域
根據同源策略,cookie 是區分埠的,但是對瀏覽器來說,cookie是區分域,不區分埠的,在一個ip地址下多個埠的 cookie 是共享的,
[ Security ] WEB安全 ( 三 ) 之 Cookie安全策略
Cookie的Secure屬性
cookie在不同埠號可以共享嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355463.html
標籤:其他
下一篇:本周學習總結

