理解cookies

理解cookies

[TOC]javascript

​ 對於一個web開發者來講,瞭解基本的http協議是必不可少的,只有基礎扎的牢,才能在使用的時候遊刃有餘。html

對於學習我一直都是抱着刨根問底的態度,有人說學習一個東西很簡單,有人說學習一個東西很難,剛好我屬於後者,在個人大腦裏面,學習與使用是兩個不一樣的層次,學習應該是包涵使用的。

(文章開頭就說這麼廢話)java

這篇文章的主題是cookies,下面我來談談個人對cookies的認識。

1. 什麼是cookies

cookies是http協議的一部分,它主要用來存儲一些不多的數據,這些數據能夠往來於客戶端與服務器之間。

2. cookies存在的意義

爲何會有cookies這種東西存在,這要從http的特性談起,起初http是一個無狀態的協議(固然如今也是無狀態的協議),之因此無狀態是由於http是基於tcp的上傳應用協議,它的一個主要特色就是用完即放,也就是客戶端發起請求、服務器相應後tcp鏈接就斷開了,這種模式決定了是http沒法保存狀態。

協議自己就是一種約定,爲相同的場景約定出來一套規範,爲將來可能的場景預測出來一套規範。

那麼有了cookies後http就變得有狀態了,能夠說cookies是對http的擴展或者加強,比較經常使用的好比:保存用戶的登錄狀態。雖然是對http的一種加強,可是也引入了一些安全問題,後面會談到具體的安全隱患。

cookies是一種古老的技術,算然如今的瀏覽器提供了其它本地存儲技術,但仍是不能徹底替代cookies,由於cookies是一種能夠被服務器端控制的客戶端存儲技術,而無需咱們用javascript寫額外的存儲代碼。

3.如何使用cookies

cookies中定義了幾個關鍵屬性來保證cookies的正常工做。
  • Expires、Max-Age:web

    • 若是在不設定該值時爲【會話期cookie】也就是說當瀏覽器關閉的時候cookie失效,
    • 持久cookie,設置該值爲一個固定的日期,在這個日期以前cookie會一直有效
    • Max-Age的優先級高於Expires,若是設置了Max-Age則Expires無效
  • Domain、Path:瀏覽器

    • Domain用來指定該cookie能夠被哪一個主機訪問,若設置了該值一般包含其子域名;默認爲當前文檔的主機,不包含子域名。安全

    • Path:設置可被主機下的哪些路徑訪問,例如/docs與/docs/會匹配不一樣的路徑,前者包含子路勁,後者僅爲當前路徑服務器

  • SameSite:cookie

    • 設置在跨站請求時cookie怎麼發送,asp.net core中定義了三種模式:lax、none、strict,默認爲lax鬆懈模式。
  • Secure、HttpOnly:asp.net

    • Secure設置的cookie要求必須在https協議中才會被髮送到服務器(高版本瀏覽器支持)
    • HttpOnly設置的cookie不容許客戶端訪問,防止xss攻擊

4. cookies安全

http中引入cookies雖然解決了狀態的問題,但也引入了新的安全問題,如何才能保證cookies不被竊取。在我看來http是無安全可言的,咱們能作的不多,咱們努力盡可能防止客戶端被攻破,但也只僅僅是稍微增長了一點破解難度而已。

下面列舉兩個常常遇到的安全問題:xss

  • xss攻擊

    跨站腳本攻擊,經過設置HttpOnly來阻止客戶端獲取cookies

  • csrf

    跨站請求僞造,被攻擊的網站對於敏感的操做增長確認步驟。

    //若是用戶剛好登錄example.com,此時若是在同一瀏覽器的其它站點無心中有如下圖片代碼,則就會被攻擊。
    <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

參考

相關文章
相關標籤/搜索