国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

詳解 Cookie,Session,Token

Allen / 2179人閱讀

摘要:由于是存在客戶端上的,所以瀏覽器加入了一些限制確保不會(huì)被惡意使用,同時(shí)不會(huì)占據(jù)太多磁盤空間。簽名是對(duì)前兩部分的簽名,防止數(shù)據(jù)被篡改。的作用最開(kāi)始的初衷是為了實(shí)現(xiàn)授權(quán)和身份認(rèn)證作用的,可以實(shí)現(xiàn)無(wú)狀態(tài),分布式的應(yīng)用授權(quán)。

前言 無(wú)狀態(tài)的HTTP協(xié)議

很久很久之前, Web基本都是文檔的瀏覽而已。既然是瀏覽, 作為服務(wù)器, 不需要記錄在某一段時(shí)間里都瀏覽了什么文檔, 每次請(qǐng)求都是一個(gè)新的HTTP協(xié)議,就是請(qǐng)求加響應(yīng)。不用記錄誰(shuí)剛剛發(fā)了HTTP請(qǐng)求, 每次請(qǐng)求都是全新的

如何管理會(huì)話

隨著交互式Web應(yīng)用的興起, 像在線購(gòu)物網(wǎng)站,需要登錄的網(wǎng)站等,馬上面臨一個(gè)問(wèn)題,就是要管理回話,記住那些人登錄過(guò)系統(tǒng),哪些人往自己的購(gòu)物車中放商品,也就是說(shuō)我必須把每個(gè)人區(qū)分開(kāi)。

本文主要講解cookie,session, token 這三種是如何管理會(huì)話的;

cookie

cookie 是一個(gè)非常具體的東西,指的就是瀏覽器里面能永久存儲(chǔ)的一種數(shù)據(jù)。跟服務(wù)器沒(méi)啥關(guān)系,僅僅是瀏覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲(chǔ)功能。

cookie由服務(wù)器生成,發(fā)送給瀏覽器,瀏覽器把cookie以KV形式存儲(chǔ)到某個(gè)目錄下的文本文件中,下一次請(qǐng)求同一網(wǎng)站時(shí)會(huì)把該cookie發(fā)送給服務(wù)器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會(huì)被惡意使用,同時(shí)不會(huì)占據(jù)太多磁盤空間。所以每個(gè)域的cookie數(shù)量是有限制的。

如何設(shè)置 客戶端設(shè)置
document.cookie = "name=xiaoming; age=12 "

客戶端可以設(shè)置cookie的一下選項(xiàng): expires, domain, path, secure(只有在https協(xié)議的網(wǎng)頁(yè)中, 客戶端設(shè)置secure類型cookie才能生效), 但無(wú)法設(shè)置httpOnly選項(xiàng)

設(shè)置cookie => cookie被自動(dòng)添加到request header中 => 服務(wù)端接收到cookie
服務(wù)端設(shè)置

不管你是請(qǐng)求一個(gè)資源文件(如html/js/css/圖片), 還是發(fā)送一個(gè)ajax請(qǐng)求, 服務(wù)端都會(huì)返回response.而response header中有一項(xiàng)叫set-cookie, 是服務(wù)端專門用來(lái)設(shè)置cookie的;

一個(gè)set-cookie只能設(shè)置一個(gè)cookie, 當(dāng)你想設(shè)置多個(gè), 需要添加同樣多的set-cookie

服務(wù)端可以設(shè)置cookie的所有選項(xiàng): expires, domain, path, secure, HttpOnly

Cookie,SessionStorage,LocalStorage

HTML5提供了兩種本地存儲(chǔ)的方式 sessionStorage 和 localStorage;

session 什么是session

session從字面上講,就是會(huì)話。這個(gè)就類似你和一個(gè)人交談,你怎么知道當(dāng)時(shí)和你交談的是張三而不是李四呢?對(duì)方肯定有某種特征(長(zhǎng)相等)表明他是張三;
session也是類似的道理,服務(wù)器要知道當(dāng)前請(qǐng)求發(fā)給自己的是誰(shuí)。為了做這種區(qū)分,服務(wù)器就是要給每個(gè)客戶端分配不同的"身份標(biāo)識(shí)",然后客戶端每次向服務(wù)器發(fā)請(qǐng)求的時(shí)候,都帶上這個(gè)”身份標(biāo)識(shí)“,服務(wù)器就知道這個(gè)請(qǐng)求來(lái)自與誰(shuí)了。
至于客戶端怎么保存這個(gè)”身份標(biāo)識(shí)“,可以有很多方式,對(duì)于瀏覽器客戶端,大家都采用cookie的方式。

過(guò)程(服務(wù)端session + 客戶端 sessionId)

1.用戶向服務(wù)器發(fā)送用戶名和密碼

2.服務(wù)器驗(yàn)證通過(guò)后,在當(dāng)前對(duì)話(session)里面保存相關(guān)數(shù)據(jù),比如用戶角色, 登陸時(shí)間等;

3.服務(wù)器向用戶返回一個(gè)session_id, 寫入用戶的cookie

4.用戶隨后的每一次請(qǐng)求, 都會(huì)通過(guò)cookie, 將session_id傳回服務(wù)器

5.服務(wù)端收到 session_id, 找到前期保存的數(shù)據(jù), 由此得知用戶的身份

存在的問(wèn)題 擴(kuò)展性不好

單機(jī)當(dāng)然沒(méi)問(wèn)題, 如果是服務(wù)器集群, 或者是跨域的服務(wù)導(dǎo)向架構(gòu), 這就要求session數(shù)據(jù)共享,每臺(tái)服務(wù)器都能夠讀取session。

舉例來(lái)說(shuō), A網(wǎng)站和B網(wǎng)站是同一家公司的關(guān)聯(lián)服務(wù)。現(xiàn)在要求,用戶只要在其中一個(gè)網(wǎng)站登錄,再訪問(wèn)另一個(gè)網(wǎng)站就會(huì)自動(dòng)登錄,請(qǐng)問(wèn)怎么實(shí)現(xiàn)?這個(gè)問(wèn)題就是如何實(shí)現(xiàn)單點(diǎn)登錄的問(wèn)題

Nginx ip_hash 策略,服務(wù)端使用 Nginx 代理,每個(gè)請(qǐng)求按訪問(wèn) IP 的 hash 分配,這樣來(lái)自同一 IP 固定訪問(wèn)一個(gè)后臺(tái)服務(wù)器,避免了在服務(wù)器 A 創(chuàng)建 Session,第二次分發(fā)到服務(wù)器 B 的現(xiàn)象。

Session復(fù)制:任何一個(gè)服務(wù)器上的 Session 發(fā)生改變(增刪改),該節(jié)點(diǎn)會(huì)把這個(gè) Session 的所有內(nèi)容序列化,然后廣播給所有其它節(jié)點(diǎn)。

共享Session:將Session Id 集中存儲(chǔ)到一個(gè)地方,所有的機(jī)器都來(lái)訪問(wèn)這個(gè)地方的數(shù)據(jù)。這種方案的優(yōu)點(diǎn)是架構(gòu)清晰,缺點(diǎn)是工程量比較大。另外,持久層萬(wàn)一掛了,就會(huì)單點(diǎn)失敗;

另一種方案是服務(wù)器索性不保存session數(shù)據(jù)了,所有數(shù)據(jù)就保存在客戶端,每次請(qǐng)求都發(fā)回服務(wù)器。這種方案就是接下來(lái)要介紹的基于Token的驗(yàn)證;

Token 過(guò)程

用戶通過(guò)用戶名和密碼發(fā)送請(qǐng)求

程序驗(yàn)證

程序返回一個(gè)簽名的token給客戶端

客戶端儲(chǔ)存token, 并且每次用每次發(fā)送請(qǐng)求

服務(wù)端驗(yàn)證Token并返回?cái)?shù)據(jù)

這個(gè)方式的技術(shù)其實(shí)很早就已經(jīng)有很多實(shí)現(xiàn)了,而且還有現(xiàn)成的標(biāo)準(zhǔn)可用,這個(gè)標(biāo)準(zhǔn)就是JWT;

JWT(JSON Web Token) 數(shù)據(jù)結(jié)構(gòu)

實(shí)際的JWT大概就像下面這樣:

JSON Web Tokens由dot(.)分隔的三個(gè)部分組成,它們是:

Header(頭部)

Payload(負(fù)載)

Signature(簽名)

因此,JWT通常如下展示:

xxxxx.yyyyy.zzzz

Header(頭部)

Header 是一個(gè) JSON 對(duì)象

{
  "alg": "HS256", // 表示簽名的算法,默認(rèn)是 HMAC SHA256(寫成 HS256)
  "typ": "JWT"  // 表示Token的類型,JWT 令牌統(tǒng)一寫為JWT
}
Payload(負(fù)載)

Payload 部分也是一個(gè) JSON 對(duì)象,用來(lái)存放實(shí)際需要傳遞的數(shù)據(jù)

{
  // 7個(gè)官方字段
  "iss": "a.com", // issuer:簽發(fā)人
  "exp": "1d", // expiration time: 過(guò)期時(shí)間
  "sub": "test", // subject: 主題
  "aud": "xxx", // audience: 受眾
  "nbf": "xxx", // Not Before:生效時(shí)間
  "iat": "xxx", // Issued At: 簽發(fā)時(shí)間
  "jti": "1111", // JWT ID:編號(hào)
  // 可以定義私有字段
  "name": "John Doe",
  "admin": true
}

JWT 默認(rèn)是不加密的,任何人都可以讀到,所以不要把秘密信息放在這個(gè)部分。

Signature(簽名)

Signature 是對(duì)前兩部分的簽名,防止數(shù)據(jù)被篡改。

首先,需要指定一個(gè)密鑰(secret)。這個(gè)密鑰只有服務(wù)器才知道,不能泄露給用戶。然后,使用Header里面指定的簽名算法(默認(rèn)是 HMAC SHA256),按照下面的公式產(chǎn)生簽名。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

算出簽名后,把 Header、Payload、Signature 三個(gè)部分拼成一個(gè)字符串,每個(gè)部分之間用"點(diǎn)"(.)分隔,就可以返回給用戶。

JWT = Base64(Header) + "." + Base64(Payload) + "." + $Signature
如何保證安全?

發(fā)送JWT要使用HTTPS;不使用HTTPS發(fā)送的時(shí)候,JWT里不要寫入秘密數(shù)據(jù)

JWT的payload中要設(shè)置expire時(shí)間

使用方式

客戶端收到服務(wù)器返回的 JWT,可以儲(chǔ)存在 Cookie 里面,也可以儲(chǔ)存在 localStorage。此后,客戶端每次與服務(wù)端通信,都要帶上這個(gè)JWT。你可以把它放在Cookie里面自動(dòng)發(fā)送,但是這樣不能跨域,所以更好的做法是放在HTTP請(qǐng)求的頭信息 Authorization 字段里面。

Authorization: Bearer 

另一種做法是, 跨域的時(shí)候, JWT就放在POST請(qǐng)求的數(shù)據(jù)體里。

JWT 的作用

JWT最開(kāi)始的初衷是為了實(shí)現(xiàn)授權(quán)和身份認(rèn)證作用的,可以實(shí)現(xiàn)無(wú)狀態(tài),分布式的Web應(yīng)用授權(quán)。大致實(shí)現(xiàn)的流程如下

客戶端需要攜帶用戶名/密碼等可證明身份的的內(nèi)容去授權(quán)服務(wù)器獲取JWT信息;

每次服務(wù)都攜帶該Token內(nèi)容與Web服務(wù)器進(jìn)行交互,由業(yè)務(wù)服務(wù)器來(lái)驗(yàn)證Token是否是授權(quán)發(fā)放的有效Token,來(lái)驗(yàn)證當(dāng)前業(yè)務(wù)是否請(qǐng)求合法。

這里需要注意:不是每次請(qǐng)求都要申請(qǐng)一次Token,這是需要注意,如果不是對(duì)于安全性要求的情況,不建議每次都申請(qǐng),因?yàn)闀?huì)增加業(yè)務(wù)耗時(shí);比如只在登陸時(shí)申請(qǐng),然后使用JWT的過(guò)期時(shí)間或其他手段來(lái)保證JWT的有效性;

一個(gè)簡(jiǎn)單的JWT使用示例 準(zhǔn)備
npm i --save koa koa-route koa-bodyparser @koa/cors jwt-simple
服務(wù)端代碼
const Koa = require("koa");
const app = new Koa();
const route = require("koa-route");
var bodyParser = require("koa-bodyparser");
const jwt = require("jwt-simple");
const cors = require("@koa/cors");

const secret = "your_secret_string"; // 加密用的SECRET字符串,可隨意更改
app.use(bodyParser()); // 處理post請(qǐng)求的參數(shù)

const login = ctx => {
    const req = ctx.request.body;
    const userName = req.userName;
    const expires = Date.now() + 3600000; // 設(shè)置超時(shí)時(shí)間為一小時(shí)后
    
    var payload = { 
        iss: userName,
        exp: expires
    };
    const Token = jwt.encode(payload, secret);
    ctx.response.body = {
        data: Token,
        msg: "登陸成功"
    };
}
const getUserName = ctx => {
    const reqHeader = ctx.request.headers;
   
    const token = reqHeader.authorization.split(" ")[1];
    var decoded = jwt.decode(token, secret);
    ctx.response.body = {
        data: {
            username: decoded.iss,
        },
        msg: "獲取用戶名成功"
    };
}
app.use(cors());
app.use(route.post("/login", login));
app.use(route.get("/getUsername", getUserName));
app.listen(3200, () => {
    console.log("啟動(dòng)成功");
});
客戶端代碼




    
    
    
    JWT-demo
    



    
    
    
    

運(yùn)行代碼

以上只是一個(gè)特別簡(jiǎn)單的例子, 很多邊界條件沒(méi)有做處理,比如未登陸的校驗(yàn),異常的處理,Token過(guò)期的判斷;
區(qū)別 Cookie和Session的區(qū)別

存儲(chǔ)位置不同: cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上

隱私策略不同:cookie不是很安全, 別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,考慮到安全應(yīng)當(dāng)使用session

session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問(wèn)增多,就會(huì)比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie

存儲(chǔ)大小不同: 單個(gè)cookie保存的數(shù)據(jù)不能超過(guò)4k, 很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie

一般建議: 將登陸信息等重要信息存放為session, 其他信息如果需要保留,可以放在cookie中
Token和Session的區(qū)別

Session是一種HTTP儲(chǔ)存機(jī)制, 為無(wú)狀態(tài)的HTTP提供持久機(jī)制;
Token就是令牌, 比如你授權(quán)(登錄)一個(gè)程序時(shí),它就是個(gè)依據(jù),判斷你是否已經(jīng)授權(quán)該軟件;

Session和Token并不矛盾,作為身份認(rèn)證Token安全性比Session好,因?yàn)槊恳粋€(gè)請(qǐng)求都有簽名還能防止監(jiān)聽(tīng)以及重放攻擊,而Session就必須依賴鏈路層來(lái)保障通訊安全了。如上所說(shuō),如果你需要實(shí)現(xiàn)有狀態(tài)的回話,仍然可以增加Session來(lái)在服務(wù)端保存一些狀態(tài)。

總結(jié)

cookie,session,Token沒(méi)有絕對(duì)的好與壞之分,只要還是要結(jié)合實(shí)際的業(yè)務(wù)場(chǎng)景和需求來(lái)決定采用哪種方式來(lái)管理回話,當(dāng)然也可以三種都用。

參考

jwt

徹底理解cookie,session,token

JSON Web Token 入門教程

Cookie、Session、Token那點(diǎn)事兒(原創(chuàng))

3種web會(huì)話管理的方式

你真的了解 Cookie 和 Session 嗎

不要用JWT替代session管理(上):全面了解Token,JWT,OAuth,SAML,SSO

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/104652.html

相關(guān)文章

  • 什么是單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶想要訪問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪問(wèn),系統(tǒng)發(fā)現(xiàn)用戶并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就...

    levy9527 評(píng)論0 收藏0
  • 什么是單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶想要訪問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪問(wèn),系統(tǒng)發(fā)現(xiàn)用戶并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:github.com/ZhongFuChen… 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊: ...

    番茄西紅柿 評(píng)論0 收藏0
  • 什么是單點(diǎn)登錄(SSO)

    摘要:此時(shí),用戶想要訪問(wèn)系統(tǒng)受限的資源比如說(shuō)訂單功能,訂單功能需要登錄后才能訪問(wèn),系統(tǒng)發(fā)現(xiàn)用戶并沒(méi)有登錄,于是重定向到認(rèn)證中心,并將自己的地址作為參數(shù)。前言 只有光頭才能變強(qiáng)。 文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:github.com/ZhongFuChen… 在我實(shí)習(xí)之前我就已經(jīng)在看單點(diǎn)登錄的是什么了,但是實(shí)習(xí)的時(shí)候一直在忙其他的事,所以有幾個(gè)網(wǎng)站就一直躺在我的收藏夾里邊: ...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<