HTTP是個無狀態協議,怎麼保持登錄狀態?

拿知乎來說,在知乎里點開一個鏈接進去還是有登錄的狀態。

是整個網站都要用一個COOKIES?

TOKEN是什麼?如果是一次性的,就是說每點開一個頁面都要換一個唯一的TOKEN?


不懂,至於你說的token,給個資料大家一起學習

單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。

多個站點單點登錄的設計思路 -- 簡明現代魔法

多個站點單點登錄的設計思路

2010-07-28

當前各門戶一般也都實現了多個業務之間的單點登錄。下面根據我經歷過的項目,談一下我自己的看法。

一般來說單點認證都需要兩端來完成,在認證中心端的我們稱之為SSO,在網站端的模塊我們稱之為PSO。兩個模塊之間採用二次重定向技術來實現同步兩端票據的方式來實現單點登陸。

為什麼需要單點登錄?

產品剛上線時,一般由於用戶量少,所有的功能都放在一起,一般也不需要具體的單點登錄。隨著用戶量和業務發展的需要,要求逐步將產品按功能或性能分為相應獨立的站點,並分開部署,這就需要在各個站點之間進行單點登錄,以達到用戶一次登錄,就可以使用多個站點。

單點登錄的實現

簡單方法: 在同一個域內的站點,可以簡單的通過共享Cookie(將登錄用戶名存放Cookie中)來實現單點登錄。這種方法實現簡單,安全性方法可以通過將Cookie值加密方式加強,但對不同域下及不同開發語言下(如A站點C#,B站點C)實現麻煩。

推薦方法:建立統一的認證中心,認證中心提供:

  • 用戶登錄認證(認證用戶名和密碼),如果成功,返回表示本次登錄的登錄Token
  • 登錄Token認證(認證Token是否正確),如果成功,返回當前登錄的用戶名
  • 延長Token有效期
  • 退出(使Token失效)

認證中心獨立於各個站點,單點流程一般場景如下:

  • 用戶在站點A輸入用戶名和密碼點擊登錄
  • 站點A將用戶名和密碼轉發給認證中心進行認證,認證中心返回Token
  • 站點A將當前登錄用戶和Token存入Session(或Cookie)
  • 在站點A上點擊連接訪問站點B,通過URL參數方式,將Token帶給站點B
  • 站點B將Token轉交到認證中心,認證正確,返回當前用戶名。
  • 站點B將當前登錄用戶和Token存入Session(或Cookie),完成登錄流程

這樣的設計下的Token,還可以用在非同步使用Ajax去訪問伺服器端的介面(介面可能獨立部署在不同的站點下),這樣只需要帶上Token,伺服器端的介面認證Token通過後,直接返回這個登錄用戶的相應用戶信息。

安全性考慮

  • 用戶登錄認證介面,可增加認證頻率、認證IP等限制,防止暴力攻擊。
  • Token其實就是一串表示本次登錄的唯一字元串,可以生成字元串時,增加摘要信息。如Token的組成為:A+MD5(A+PWD) 的方式,A為隨機生成的GUID,這樣在驗證Token時,就可以直接通過演算法來驗證合法性,只有演算法驗證通過後,再進行下一步的操作。

登陸後產生一個SSO的票據,這個票據是最重要的,因為它是決定用戶是否登陸的關鍵。這個票據可以是Cookie,也可以是Session,我比較傾向於Cookie,因為現在有3DES加密,加密後篡改Cookie幾乎成為不可能,所以無論是對於伺服器負擔來說還是安全性都是Cookie比較好,可能人認為萬一不支持Cookie呢,不過我想Demo應該沒問題吧,大不了我設計成兩個都支持。

PS,為什麼不用非對稱加密?其實那個效率不高,3DES的安全性已經足夠了,至少現在還沒有人宣稱能破解。

在登陸後就可以通知用戶你已經登陸了,現在你可以去訪問成員站點了,這個時候用戶點擊了成員站點的URL,進去了,這個時候首先就需要接受PSO組件的盤查,你有沒有PSO的票據呢?很顯然是沒有的,所以這個時候請求就被Redirect回了認證中心,認證中心檢查用戶已經有了SSO的票據了,認為用戶已經登錄了,就把用戶的SSO票據附加在URL後邊然後Redirect回成員站點,成員站點的PSO這個時候獲取到了SSO票據,於是知道了用戶已經在認證端登錄了,於是就創建一個PSO票據,然後返回給用戶他所請求的內容。所以我們來看看其實PSO的邏輯更加複雜一點。

我們可以看到其實兩個模塊的功能都不算複雜,這裡存在幾個現實的問題,第一個是加密問題,票據需要加密,傳輸的URL也需要加密。

在SSO把票據通過URL發送給PSO的時候,如果我們能夠截獲這個URL,不管他加沒有加密,在下一次我們直接用這個URL去訪問站點的時候因為已經包含SSO票據了,所以PSO會認為已經登陸了而直接產生PSO票據然後就讓用戶進去了,這顯然是一個漏洞。所以呢,我們需要在這裡給這個URL加一點鹽值(所謂鹽值其實就是加點料),我們通過在URL里加入時間戳來讓這個URL具備時間限制,這個樣子URL具備失效期,過了這個時間即使截獲到了這個URL也完全沒有作用了。

-------------------------華麗的分割線-------------------------------------------

講另一個SSO 單點登錄的應用

在遊戲開發中,一般渠道研發上是分離的,拿手游為例,導入的用戶帳號信息是渠道平台商的,gameserver無法通過帳號信息判斷登錄用戶的合法性,平台SDK一般都會將登錄名和密碼發送到平台SDKServer,然後返回一個登錄token給遊戲App,此時遊戲App將token信息以及帳號信息發送到gameserver,gameserver將token發送給SDKServer驗證,驗證登錄用戶的合法性,成功則返回登錄成功,並通過帳號返回用戶角色信息,否則登錄失敗。這也是token的一個應用


謝邀。Cookie 唄。


http 是無狀態協議,所以需要登錄的票據來表示兩個請求是同一個用戶發出的。一般來說,對於瀏覽器,我們在登錄成功後生成一個命名如 session_id 的字元串存在 cookie 中,每次請求伺服器的時候會在 http header 裡面帶上。伺服器校驗並取出用戶的 id,以此來識別兩個請求是否是同一個用戶發出的。


無狀態協議中認證狀態保持方案的一些思考


推薦閱讀:

寫後端 Python,nodejs和php哪個更好一些?
IP地址為什要分類?就是a類,b類,c類。。。?
對於網路「故意錯別字」現象有什麼看法?
HTTP/2正式發布可能會使WEB開發領域產生哪些趨勢?
在網路條件下,議程設置會失效嗎?為什麼?

TAG:計算機網路 | HTTP | session共享 | session | Cookie |