登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)

简介: 登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)

一、背景说明

在开发登录功能时,难以避免的会面临选择何种会话技术,来对用户的登录状态进行认证和校验。常见的三种方式包括:

  • cookie
  • session
  • JWT令牌

下面依次展开对这三种会话技术的优缺点进行说明。

二、会话技术之 Cookie

1、为什么说cookie是客户端会话技术

cookie是一种客户端会话技术,他是存储在浏览器的,那为什么说他是客户端会话技术呢?可以看以下代码来证明:

private static void set(HttpServletResponse response, String key, String value, String domain, String path, int maxAge, boolean isHttpOnly) {
    Cookie cookie = new Cookie(key, value);
    if (domain != null) {
      cookie.setDomain(domain);
    }
    cookie.setPath(path);
    cookie.setMaxAge(maxAge);
    cookie.setHttpOnly(isHttpOnly);
    response.addCookie(cookie);//直接响应给浏览器,没有存储在服务器端
  }

他是由服务器端,通过response对象直接响应给浏览器的,并没有存在服务器中。

下图就是服务器响应给客户端浏览器的cookie

2、cookie的优点和缺点

优点

  • 他是HTTP协议中支持的技术
  • 占用更少的内存,不需要任何服务器资源,并存储在用户的计算机上,因此不会给服务器带来额外的负担。

缺点

  • 移动端APP无法使用cookie
  • 不安全,用户可以自己禁用浏览器的cookie
  • cookie不能跨域

补充说明一下,跨域区分的三个维度:协议、域名/IP、端口

三、会话技术之 Session

1、为什么说Session是服务端会话技术

Session是一种服务端会话技术,他是存储在服务器上的,那为什么说他是服务器会话技术呢?可以看以下代码来证明:

public static String getValue(HttpServletRequest request, String key) {
    HttpSession session = request.getSession();
    session.setAttribute("login",key+"_"+ UUID.randomUUID());
    .......
  }

当客户端第一次请求服务器的时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象

下图是浏览器请求服务器端接口时,浏览器会把之前服务器端生成的sessionID,通过请求头带给服务器

2、session的优点和缺点

优点

  • 存储在服务器端,比较安全

缺点

  • 服务器集群环境下无法直接使用session

四、令牌技术JWT

1、JWT 的原理

服务器认证以后,生成一个 JSON 对象,发回给用户,就像下面这样。

{
“姓名”: “张三”,
“角色”: “管理员”,
“到期时间”: “2018年7月1日0点0分”
}

以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名(详见后文)。

服务器就不保存任何 session 数据了,也就是说,服务器变成无状态了,从而比较容易实现扩展。

2、JWT的优点和缺点

优点

  • 支持pc端、移动端
  • 解决集群环境下的认证问题
  • 减去服务器端的存储压力

缺点

  • JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
  • JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。


相关文章
|
1月前
|
存储 自然语言处理 API
Session、cookie、token有什么区别?
Session、cookie、token有什么区别?
24 1
|
2天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
11 3
|
13天前
|
存储 JSON 安全
|
25天前
|
存储 JSON Java
面试官:Session和JWT有什么区别?
JSON Web Token (JWT) 是一种开放标准,用于安全地在网络上传输信息。JWT 包含头部、载荷和签名三部分,常用于身份验证和授权。与Session相比,JWT有以下优势:无服务器存储状态,支持跨域,适应微服务架构,自包含且可扩展。在Java开发中,可以使用HuTool框架操作JWT,包括生成、验证和解析Token。JWT通过在客户端存储令牌实现无状态认证,与Session的主要区别在于工作原理、存储方式和有效期管理。
32 6
|
1月前
|
JSON 前端开发 Java
|
1月前
|
数据采集 存储 安全
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
登录态数据抓取:Python爬虫携带Cookie与Session的应用技巧
|
1月前
|
存储 安全 搜索推荐
Django中Cookie和Session的使用
Django中Cookie和Session的使用
21 0
|
1月前
|
存储 安全 对象存储
Cookie和Session的区别:从原理到应用
【2月更文挑战第18天】
56 6
|
1月前
|
存储 JSON Java
spring boot3登录开发-1(整合jwt)
spring boot3登录开发-1(整合jwt)
59 1
|
1月前
|
存储 搜索推荐 安全
【Web开发】cookie和session
【Web开发】cookie和session