單點登入與許可權管理本質:session和cookie介紹

情情說發表於2018-02-27

本篇開始寫「單點登入與許可權管理」系列的第一部分:單點登入與許可權管理本質,這部分主要介紹相關的知識概念、抽象的處理過程、常見的實現框架。通過這部分的介紹,能夠對單點登入與許可權管理有整體上的瞭解,對其相關概念、處理流程、常見實現有個基本的認識。

本篇文章介紹下session和cookie,它是登入實現的基礎,主要從下面幾個方面介紹:

  • session和cookie基本概念
  • session的生命週期
  • cookie的作用域

cookie的跨域問題會在後續文章單獨介紹。

基本概念

大部分系統都需要識別使用者的身份,有些功能只有特定的使用者能使用,有些功能需要根據使用者身份顯示不同的內容,一般使用唯一編號標識使用者的身份。

就像我們的身份證,身份證號是每個人唯一的,根據所在的省市區、出生年月、性別等規則生成,我們去政府機構辦事時,都需要帶著身份證,他們通過身份證驗證我們的身份。

session和cookie主要用來識別登入者身份的,預設通過JSESSIONID唯一編號進行驗證。session是在服務端儲存的一個資料結構,用來跟蹤使用者的狀態,也可以儲存使用者相關的一些資料,可以儲存在記憶體、快取、資料庫等儲存結構中。cookie是客戶端儲存使用者資訊的一種機制。

servlet session

javax.servlet.http包中是session的主要API介面,主要有以下幾種介面:

  • HttpSession:實際的session介面定義;
  • Listener:session發生一些動作,如建立,設定屬性,失效等,會觸發一些事件,進行相應的處理;
  • Event:當動作觸發之後,封裝為對應的事件;

Session相關介面

session相關的介面,一般由應用伺服器來實現,比如Tomcat、Resin、Jetty。Session的主要特徵:

  • 可以設定和獲取一些屬性;
  • 每個session對應一個編號sessionId,是一次會話的唯一表示;
  • session有超時時間,使用者長時間無操作,維護的定時器會清除session,保證資源及時釋放;
  • 可以通過呼叫invalidate方法主動清除session;

在tomcat中,HttpSession的實現是StandardSession,同時StandardSession會實現自定義的Session介面,它是對HttpSesion一個包裝。

Tomcat Sesion介面

另外,tomcat會實現session的管理和持久化,可隨時獲取到對應的session,具體實現不在本篇分析,網上有很多文章介紹。

cookie

cookie是客戶端的解決方案,是伺服器發給客戶端的特殊資訊,這些資訊以文字檔案的方式存放在客戶端,後續請求,客戶端都會帶上這些特殊的資訊。

服務端通過HTTPResponse設定cookie到響應頭,傳送到客戶端,後續客戶端自動將cookie資訊設定到請求頭。下面是我登入百度後的cookie資訊:

百度cookie資訊

cookie也有失效時間,可在服務端通過cookie.setMaxAge(expiry)進行設定,expiry=-1:代表瀏覽器關閉後,cookie就失效了;expiry>0:代表會將cookie儲存到硬碟中,直到設定時間過期才會被瀏覽器自動刪除;expiry=0:刪除cookie,cookie都會被瀏覽器給刪除。

另外還有其他幾個特性:

  • setDomain:設定cookie範圍,後面會詳細介紹;
  • isHttpOnly:是否只是http協議使用。只能在後端通過getCookies()獲取,js不能獲取;
  • 每一個cookie檔案大小:4kb , 如果超過4kb瀏覽器不識別;
  • cookie不安全,可能洩露使用者資訊,瀏覽器支援禁用cookie操作;
  • 臨時session:預設生命週期,當瀏覽器關閉時cookie銷燬的;
互動過程

互動過程圖

  1. 使用瀏覽器訪問服務端頁面;
  2. 服務端收到該客戶端第一次請求後,會建立一個session,生產一個唯一sessionId;
  3. 同時在響應請求中設定cookie,屬性名為jessionid;
  4. 客戶端收到後會儲存jessionid,再次請求時,會在header中設定,服務端可從請求頭中獲取;
  5. 服務端驗證獲取的sessionId是否存在,即可驗證是否是同一使用者;

當瀏覽器禁用cookie後,基於cookie的session將不能正常工作,每次都將建立一個新的session,可通過url重寫傳遞jsessionid。

session的生命週期

session儲存在伺服器端,session在使用者第一次訪問時建立,訪問jsp、servlet等程式時才會建立Session,只訪問html、image等靜態資源並不會建立,可呼叫request.getSession(true)強制生成Session。

伺服器會把長時間沒有活動的Session從記憶體中清除,tomcat中session的預設失效時間為30分鐘,可呼叫呼叫session的invalidate方法強制清楚。

另外,我們可以自己實現session生命週期的管理,以滿足特定的業務需求,比如後續要講的單點登入、分散式session等,tomcat可提供了相應擴充套件,後續文章會介紹。

cookie的作用域

建立cookie時,需要設定domain,有多級域名時,可以控制cookie的作用域。如果網站請求量很大,設定的cookie作用域不當,會浪費很多流量。

下面舉例說明,比如有三級域名support.kefu.mi.com,其中,mi.com是一級域名,kefu.mi.com是二級域名。

在3類域名下進行cookie設定,分別設定不同的domain,看看訪問各級域名時cookie的有效性。當domain設定為空時,domain預設為當前域名。

在一級域名mi.com下設定cookie
domain引數 訪問一級 訪問二級 訪問三級
mi.com
kefu.mi.com × × ×
mcc.kefu.mi.com × × ×

當domain為一級域名時,一級域名、包括其下的子域名都可以接收到cookie。但是domain引數設定其子域名時,所有域名就接收不到了,包括那個子域名。

在二級域名kefu.mi.com下設定cookie
domain引數 訪問一級 訪問二級 訪問三級
×
mi.com
kefu.mi.com ×
mcc.kefu.mi.com × × ×

當domain為自身域名時,其父域名無法接收到cookie,其本身與其子域名可以接收到cookie。而設定其子域名或其他域名時,所有域名都接收不到cookie。

在三級域名mcc.kefu.mi.com下設定cookie
domain引數 訪問一級 訪問二級 訪問三級
× ×
mi.com
kefu.mi.com ×
mcc.kefu.mi.com × ×

可以得出結論:domain引數可以設定父域名以及自身,但不能設定其它域名,包括子域名,否則cookie不起作用。

系列索引:

  1. session和cookie介紹
  2. HTTP重定向
  3. 單點登入介紹
  4. cookie安全問題
  5. 許可權管理介紹

情情說

相關文章