博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
鉴权和认证服务器
阅读量:7002 次
发布时间:2019-06-27

本文共 1489 字,大约阅读时间需要 4 分钟。

目前登录凭证的方式无非两种: 

一个是通过服务器端的session,一个是通过浏览器的cookie. 
简而言之:session和cookie

常规的是通过session 

步骤: 
1,用户在浏览器登录 
2,后台鉴权,若登录成功,则把用户信息写入session,servlet自动生成JSESSIONID 返回浏览器; 
3,浏览器把JSESSIONID 写入cookie 
说明:cookie是浏览器的存储文件,存储的只是JSESSIONID,而不是用户信息; 
JSESSIONID 只是一个钩子,用户信息其实存储在服务器端.

比如我在浏览器登录之后,重新打开一个标签页,输入相同的地址,仍然是登录状态,因为标签页共享cookie. 

也就是说我只要获取到JSESSIONID ,就可以获取用户隐私信息,比如除用户名以外的其他信息(密码,姓名,年龄等).也可以做一些敏感操作,比如修改密码

浏览器发送请求时会带上cookie 

这样服务器端才知道是否登录过: 

例如,我获取到JSESSIONID 之后,使用HTTP模拟发送请求: 

服务器端是如何判断是否登录

Java代码  
  1. /*** 
  2.      * 判断是否已登录 
  3.      * 
  4.      * @param user2 
  5.      * @return 
  6.      */  
  7.     public static boolean isLogined(GenericUser user2, String loginFlag) {  
  8.         if (ValueWidget.isNullOrEmpty(user2) || ValueWidget.isNullOrEmpty(user2.getUsername())  
  9.                 || (!Constant2.FLAG_LOGIN_SUCCESS.equalsIgnoreCase(loginFlag))) {  
  10.             return false;  
  11.         } else {  
  12.             return true;  
  13.         }  
  14.     }  
  15.   
  16.     /*** 
  17.      * 判断是否已登录 
  18.      * 
  19.      * @param session 
  20.      * @return 
  21.      */  
  22.     public static boolean isLogined(HttpSession session) {  
  23.         String loginFlag = (String) session  
  24.                 .getAttribute(Constant2.SESSION_KEY_LOGINED_FLAG);  
  25.         GenericUser user2 = (GenericUser) session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);  
  26.         return isLogined(user2, loginFlag);  
  27.     }  

 

如果通过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

 segmentfault 登录时,竟然使用明文密码:

 

你可能感兴趣的文章