目前登錄憑證的方式無非兩種:
一個是通過服務器端的session,一個是通過瀏覽器的cookie.
簡而言之:session和cookie
常規(guī)的是通過session
步驟:
1,用戶在瀏覽器登錄
2,后臺鑒權,若登錄成功,則把用戶信息寫入session,servlet自動生成JSESSIONID 返回瀏覽器;
3,瀏覽器把JSESSIONID 寫入cookie
說明:cookie是瀏覽器的存儲文件,存儲的只是JSESSIONID,而不是用戶信息;
JSESSIONID 只是一個鉤子,用戶信息其實存儲在服務器端.
比如我在瀏覽器登錄之后,重新打開一個標簽頁,輸入相同的地址,仍然是登錄狀態(tài),因為標簽頁共享cookie.
也就是說我只要獲取到JSESSIONID ,就可以獲取用戶隱私信息,比如除用戶名以外的其他信息(密碼,姓名,年齡等).也可以做一些敏感操作,比如修改密碼
瀏覽器發(fā)送請求時會帶上cookie
這樣服務器端才知道是否登錄過:
例如,我獲取到JSESSIONID 之后,使用HTTP模擬發(fā)送請求:
服務器端是如何判斷是否登錄
Java代碼
/***
*?判斷是否已登錄
*
*?@param?user2
*?@return
*/
publicstaticbooleanisLogined(GenericUser?user2,?String?loginFlag)?{
if(ValueWidget.isNullOrEmpty(user2)?||?ValueWidget.isNullOrEmpty(user2.getUsername())
||?(!Constant2.FLAG_LOGIN_SUCCESS.equalsIgnoreCase(loginFlag)))?{
returnfalse;
}else{
returntrue;
}
}
/***
*?判斷是否已登錄
*
*?@param?session
*?@return
*/
publicstaticbooleanisLogined(HttpSession?session)?{
String?loginFlag?=?(String)?session
.getAttribute(Constant2.SESSION_KEY_LOGINED_FLAG);
GenericUser?user2?=?(GenericUser)?session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);
returnisLogined(user2,?loginFlag);
}
如果通過cookie呢?
詳細流程,邏輯
(1)登錄前,瀏覽器先向認證服務器請求一個OTP,認證服務器返回OTP,同時返回一個cookie給瀏覽器;
(2)認證服務器把OTP 和CCC(cookie) 掛鉤;
(3)登錄時連同帶上OTP
(4)若登錄成功,則認證服務器返回登錄憑證(access token)給應用服務器;
(5)認證服務器把CCC 和登錄憑證掛鉤;
(6)通過CCC 可以判斷用戶是否有權限.
所以,
(a)可以通過CCC 獲取登錄憑證
(b)也可以通過OTP 獲取登錄憑證
根本原因:服務器把OTP 和CCC(cookie) 掛鉤
那么CCC記在什么地方?
瀏覽器
參考:http://blog.csdn.net/hw1287789687/article/details/48373209