nginx cookie有效期討論小結(jié)
每一次訪問都會(huì)在瀏覽器生成Cookie
,那么Cookie
的存在對(duì)于用戶來說是好還是壞呢?說實(shí)話,這玩意的存在確實(shí)會(huì)帶來一系列的問題,有趣的是幾乎每個(gè)站點(diǎn)都難以離開Cookie
,由于Cookie
的使用因其貌似簡(jiǎn)單,而很容易被人輕視。最近在開發(fā)過程中,審視應(yīng)用中的Cookie
代碼,幾乎只需要很小的代價(jià)就可以獲得巨大的安全收益。因此寫下這份筆記加深記憶。
cookie的安全隱患
在實(shí)際的應(yīng)用場(chǎng)景中,Cookie
被用來做得最多的一件事是保持身份認(rèn)證的服務(wù)端狀態(tài)。這種保持可能是基于會(huì)話Session
的,也有可能是持久性的。然而不管哪一種,身份認(rèn)證Cookie
中包含的服務(wù)端票據(jù)Ticket
一旦泄露,那么服務(wù)端將很難區(qū)分帶有此票據(jù)的用戶請(qǐng)求是來自于真實(shí)的用戶,或者是來自惡意的***者。
在實(shí)際案例中,造成Cookie
泄露最多的途徑,是通過跨站腳本(如 XSS, Cross Site Script)漏洞。者可以通過一小段JavaScript
代碼,代表用戶身份的重要的Cookie
標(biāo)識(shí)。由于跨站腳本漏洞是如此的普遍(不要以為簡(jiǎn)單的HTML Encode
就可以避免被跨站,跨站是一門很深的學(xué)問,以至于在業(yè)界衍生出一個(gè)專用的名詞:跨站師),幾乎每一個(gè)網(wǎng)站都無法避免,所以這種方式是實(shí)際中被普遍使用的一種手段。
事實(shí)上避免出現(xiàn)這種問題的首要秘訣就是盡所有的可能,給你的Cookie
加上HttpOnly
的標(biāo)簽。HttpOnly
的具體使用不在本文的討論范圍內(nèi)。
Cookie 的工作原理
第一次訪問網(wǎng)站的時(shí)候,瀏覽器發(fā)出請(qǐng)求,服務(wù)器響應(yīng)請(qǐng)求后,會(huì)將Cookie
放入到響應(yīng)請(qǐng)求中,在瀏覽器第二次發(fā)請(qǐng)求的時(shí)候,會(huì)把Cookie
帶過去,服務(wù)端會(huì)辨別用戶身份,當(dāng)然服務(wù)器也可以修改Cookie
內(nèi)容.
Cookie 的生命周期
創(chuàng)建Cookie
的時(shí)候,會(huì)給Cookie
指定一個(gè)值:Expire
,它就是指定Cookie
的有效期,也就是Cookie
的生命周期,超出設(shè)置的這個(gè)生命周期,Cookie
就會(huì)被清除。如果給這個(gè)值Expire
設(shè)置為0
或者負(fù)值,那么這樣的設(shè)置就是在關(guān)閉瀏覽器時(shí),就會(huì)清除Cookie
,這種方式更加安全。
修改cookie有效期
通常情況下,我們的web
應(yīng)用服務(wù)都會(huì)通過nginx
進(jìn)行發(fā)布,這個(gè)時(shí)候,我們可以通過在nginx
上面進(jìn)行配置文件的修改來改變cookie
的有效期,由于筆者最近在基于openresty
對(duì)nginx
進(jìn)行功能開發(fā)。正好趁此機(jī)會(huì)展開對(duì)Cookie
有效期的狀態(tài)測(cè)試.
上文在Cookie
的生命周期中提到為了有效期的安全性,我們可以為Cookie
設(shè)置合理的有效期。如為0
或者負(fù)值,那么其效果是怎樣的呢?不妨看一下
修改思路
利用Openresty
的resty.cookie
進(jìn)行修改。該庫是用來對(duì)OpenResty
的HTTP cookie
操作。可以用來為Nginx
解析HTTP Cookie header
,并返回Cookie
中的每個(gè)字段。比如設(shè)置name
,value
,httponly
等屬性
有效期為24h
這里將expires
設(shè)置為有效期是一天(24h)
即當(dāng)前系統(tǒng)時(shí)間(ngx.time())
加24h
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = ngx.cookie_time(ngx.time() + 60 * 60 * 24), domain = ngx.host, })
效果
在這里可以看到我們cookie
的有效時(shí)間為5月13號(hào)的14點(diǎn)04分,說明我們的修改配置是有效的,可以通過該參數(shù)進(jìn)行Cookie
修改,只要到達(dá)這個(gè)時(shí)間點(diǎn),該Cookie
便會(huì)失效,此時(shí)用戶需要重新登錄。
有效期為創(chuàng)世紀(jì)
這里將expires
設(shè)置為有效期是-1,這里可以觀察到cookie使用的時(shí)間的是1970年,也就是UNIX紀(jì)元的元時(shí)間
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = ngx.cookie_time(-1), domain = ngx.host, })
從下圖中可以看到Cookie
有效期是1970年1月1號(hào),這個(gè)時(shí)間點(diǎn)毫無懸念的已經(jīng)過時(shí)了,當(dāng)然了,在生產(chǎn)環(huán)境中這么配置。是要被關(guān)進(jìn)小黑屋探討人生價(jià)值的,用戶遇到這樣的Cookie
配置是無論如何都無法登陸成功的
有效期為當(dāng)前
因?yàn)?code>ngx.cookie_time會(huì)返回一個(gè)格式化的字符串,可以用作Cookie
過期時(shí)間,我們自己手動(dòng)指定過期時(shí)間。通過這個(gè)方法可以測(cè)試上文說到的Cookie
自動(dòng)清除的效果
指定過期時(shí)間為-1
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = -1, domain = ngx.host, })
指定過期時(shí)間為0
local cookie = resty_cookie:new() local ok, err = cookie:set({ key = "middle_session", value = session, path = "/", secure = false, httponly = true, expires = 0, domain = ngx.host, })
結(jié)論
這里配置-1
,0
在現(xiàn)實(shí)意義上跟配置元時(shí)間是一樣的,不過好處在于,不用關(guān)小黑屋啦。Cookie
只在當(dāng)前頁面上有效,一旦關(guān)閉瀏覽器,這個(gè)Cookie
就會(huì)被瀏覽器清除,此時(shí)不用再考慮安全性問題。
參考文檔:
Cookie 安全漫談 https://www.infoq.cn/article/cookie-security
把cookie聊清楚 https://juejin.im/post/59d1f59bf265da06700b0934
淺談cookie安全 https://zhuanlan.zhihu.com/p/58666986
到此這篇關(guān)于nginx cookie有效期討論小結(jié)的文章就介紹到這了,更多相關(guān)nginx cookie有效期 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
服務(wù)器的負(fù)載均衡nginx+tomcat實(shí)現(xiàn)動(dòng)靜分離
這篇文章主要為大家介紹了服務(wù)器的負(fù)載均衡nginx+tomcat實(shí)現(xiàn)動(dòng)靜分離的案例實(shí)施步驟以及環(huán)境詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03為Node.js程序配置使用Nginx服務(wù)器的簡(jiǎn)明教程
這篇文章主要介紹了為Node.js程序配置使用Nginx服務(wù)器的簡(jiǎn)明教程,Nginx與Node自帶的服務(wù)器一樣都擁有非阻塞的高性能,需要的朋友可以參考下2016-01-01解讀nginx反向代理location和proxy_pass的映射關(guān)系
這篇文章主要介紹了解讀nginx反向代理location和proxy_pass的映射關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Nginx 負(fù)載均衡算法及故障轉(zhuǎn)移解析
這篇文章主要介紹了Nginx 負(fù)載均衡算法及故障轉(zhuǎn)移解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09