2013-10-17 42 views
0

我正在使用無cookie的方式管理我的項目(expressjs)中的會話,保留所有會話數據服務器端並在客戶端使用令牌(以前由服務器生成)在每個請求上驗證會話。管理會話的不同方式

將在用戶登錄時創建一個新的令牌並將其隱藏在頁面的某個位置,然後在每個請求中將此令牌寫入請求標頭和驗證的服務器端。此時服務器將在會話存儲中搜索令牌,可以說redis,並在找到令牌時獲取會話數據,否則將響應會話過期消息。

有一些事情我考慮這個:

  • Redis的按鍵用戶登錄創建了一個穩定的到期。
  • 每次在redis中找到會話數據時,我都必須'觸摸'鍵 ,這樣會延遲到期時間。
  • 令牌將與客戶端的IP地址一起驗證,因此不能被其他人使用。

我的問題是如果這可以被認爲是與工作安全的方式,如果有什麼我很想念這裏。謝謝

+0

您所做的與使用cookie與redis會話存儲非常相似,除了您使用的是自定義標頭而不是cookie標頭。所以是的,這是安全的。 – vkurchatkin

+2

定義「保持隱藏在頁面的某處」。另外,這聽起來像是在嘗試重新創建會話cookie,還有一個缺點,就是您的瀏覽器可能採取的任何安全措施都會繞過cookie。 – robertklep

+0

我的意思是將輸入隱藏在某個地方,毫無疑問,但是瀏覽器可能採取哪些安全措施會影響我的方法?考慮到我沒有做奇怪的事情,比如從一個域到另一個域 –

回答

0

好的,cookies是存儲會話所必需的。 Express是它的理想方式。

在快遞會議(不cookiesession)它完全存儲在服務器上,只有一個密鑰發送給客戶端。整個會話被序列化爲一個密鑰,然後發送。我假設你希望該用戶不能篡改會話cookie。您可以使用httponly cookie來防止篡改。它們只能由瀏覽器處理,不能被用戶訪問。這可以防止cookie盜用或會話劫持。您可以啓用httponly cookie:

app.use(express.session({cookie: { path: '/', httpOnly: true}, secret:'password'})); 

仍然應該使用一些加密來防止竊聽cookie。爲此,使用secure : true。你也可以提到你想用redis,mongo存儲會話的位置,或者只是在內存中。

您提到的請求令牌驗證是一種常用於防止跨站點請求僞造的技術。它不斷動態改變令牌以防止用戶獲取令牌。你可以用csrf中間件來表示這個。

app.use(express.csrf()) 

由於用戶的IP隨時間變化,IP匹配不起作用。