中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

前端設計中應該了解的web登錄

2021-02-10    分類: 網(wǎng)站建設

當時做登錄這塊的時候,被session、cookie、token各種概念差點整蒙圈了,上網(wǎng)查詢相關概念,發(fā)現(xiàn)很多人都是類似的疑惑,比如:



來了字節(jié)跳動之后,前端很少接觸HTTP請求之后的事情,而且登錄相關的SDK封裝的很好,所以這篇文章就簡單的學習記錄一下。

為什么會有登錄這回事

首先這是因為HTTP是無狀態(tài)的協(xié)議,所謂無狀態(tài)就是在兩次請求之間服務器并不會保存任何的數(shù)據(jù),相當于你和一個人說一句話之后他就把你忘掉了。所以,登錄就是用某種方法讓服務器在多次請求之間能夠識別出你,而不是每次發(fā)請求都得帶上用戶名密碼這樣的識別身份的信息。 從登錄成功到登出的這個過程,服務器一直維護了一個可以識別出用戶信息的數(shù)據(jù)結構,廣義上來說,這個過程就叫做session,也就是保持了一個會話。

常見的兩種登錄

忽然想到一點,看了網(wǎng)上很多問題,我覺得大家應該區(qū)分兩個概念:廣義的session和狹義的session

廣義的session:廣義的session就是從登錄成功到登出的過程,在這個過程中客戶端和服務器端維持了保持登錄的狀態(tài),至于具體怎么維持住這種登錄的狀態(tài),沒有要求。

狹義的session:狹義的session就是登錄成功后,服務器端存儲了一些必須的用戶信息,這部分存在服務器端的用戶信息就叫做session,也就是接下來要說的第一種登錄的實現(xiàn)方式。

服務器session+客戶端sessionId

先用圖來看:


詳細說的說一下,這里面主要是這么幾個過程:

  1. 客戶端帶著用戶名和密碼去訪問 /login 接口,服務器端收到后校驗用戶名和密碼,校驗正確就會在服務器端存儲一個sessionId和session的映射關系

2.服務器端返回response,并且將sessionId以set-cookie的方式種在客戶端,這樣一來,sessionId就存在了客戶端。這里要注意的是,將sessionId存在cookie并不是一種強制的方案,而是大家一般都這么做,而且發(fā)請求的時候符合domain和path的時候,會自動帶上cookie,省去了手動塞的過程。

3.客戶端發(fā)起非登錄請求時,服務端通過cookie中的sessionId找到對應的session來知道此次請求是誰發(fā)出的。

token

前面說到sessionId的方式本質(zhì)是把用戶狀態(tài)信息維護在server端,token的方式就是把用戶的狀態(tài)信息加密成一串token傳給前端,然后每次發(fā)請求時把token帶上,傳回給服務器端;服務器端收到請求之后,解析token并且驗證相關信息;

所以跟第一種登錄方式最本質(zhì)的區(qū)別是:通過解析token的計算時間換取了session的存儲空間

業(yè)界通用的加密方式是jwt(json web token),jwt的具體格式如圖:


簡單的介紹一下jwt,它主要由3部分組成:

header 頭部
{
 "alg": "HS256",
 "typ": "JWT"
}
payload 負載
{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022,
 "exp": 1555341649998
}
signature 簽名復制代碼

header里面描述加密算法和token的類型,類型一般都是JWT;

payload里面放的是用戶的信息,也就是第一種登錄方式中需要維護在服務器端session中的信息;

signature是對前兩部分的簽名,也可以理解為加密;實現(xiàn)需要一個密鑰(secret),這個secret只有服務器才知道,然后使用header里面的算法按照如下方法來加密:

HMACSHA256(
 base64UrlEncode(header) + "." +
 base64UrlEncode(payload),
 secret)復制代碼

總之,最后的 jwt = base64url(header) + "." + base64url(payload) + "." + signature

jwt可以放在response中返回,也可以放在cookie中返回,這都是具體的返回方式,并不重要。

客戶端發(fā)起請求時,官方推薦放在HTTP header中:

Authorization: Bearer <token>復制代碼

這樣子確實也可以解決cookie跨域的問題,不過具體放在哪兒還是根據(jù)業(yè)務場景來定,并沒有一定之規(guī)。

兩種登錄方案存在的問題

session方式

  1. session方式由于會在服務器端維護session信息,單機還好說,如果是多機的話,服務器之間需要同步session信息,服務橫向擴展不方便。
  2. session數(shù)量隨著登錄用戶的增多而增多,存儲會增加很多。
  3. session+cookie里面存sessionId的方式可能會有csrf攻擊的問題,常見的方式是使用csrf_token來解決

jwt方式

  1. jwt的過期時間需要結合業(yè)務做設置,而且jwt一旦派發(fā)出去,后端無法強行使其作廢

后話

理清概念,一身輕松

當前名稱:前端設計中應該了解的web登錄
分享地址:http://www.rwnh.cn/news48/100248.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、搜索引擎優(yōu)化、關鍵詞優(yōu)化品牌網(wǎng)站設計、自適應網(wǎng)站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設
都兰县| 宜宾市| 三门峡市| 迁西县| 济宁市| 通道| 攀枝花市| 从江县| 瑞安市| 礼泉县| 松江区| 盐边县| 金坛市| 徐闻县| 元朗区| 济阳县| 安岳县| 陕西省| 化德县| 安义县| 龙里县| 天台县| 电白县| 红安县| 崇文区| 平湖市| 景德镇市| 涟源市| 泾阳县| 卢龙县| 灌云县| 江口县| 福贡县| 安泽县| 南澳县| 长海县| 凤城市| 景泰县| 葵青区| 凉山| 崇信县|