网络应用中session和token本质是一样的吗,有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络应用中session和token本质是一样的吗,有啥区别相关的知识,希望对你有一定的参考价值。

  您好,很高兴回答您的问题。
  两者从单词字面上的意思就有很大区别
  session一般指会话,并不单单指session_id,可以是当前访问用户保存在服务器内存中的任何数据。然后,因为http是断开式的连接,即每次访问完成之后,浏览器与服力器断开连接,所以下次访问的时候,需要通过cookie中保存的session_id找到上一次访问产生的session数据。不同的后端实现的方式有所不同。
  而token一般指翻译成令牌,一般是用于验证表明身份的数据或是别的口令数据。可以用url传参,也可以用post提交,也可以夹在http的header中,就是说token从设计上必须通过get参数或者post参数提交,一般是不允许保存在cookies当中的,容易产生CSRF漏洞。这个就不像session_id那样,基本上你自己做的系统,可以自己按自己的需求定义怎么使用。
  如果您还有什么问题,可以继续追问,我会尽快回复您的问题。希望我的回答对您有所帮助,您的采纳是对我最好的鼓励,谢谢!
参考技术A 1.
session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。
1.
token的意思是“令牌”,是用户身份的验证方式,最简单的token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接token请求服务器)。还可以把不变的参数也放进token,避免多次查库
token 和session 的区别
session 和 oauth token并不矛盾,作为身份认证 token安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
app通常用restful api跟server打交道。rest是stateless的,也就是app不需要像browser那样用cookie来保存session,因此用session token来标示自己就够了,session/state由api server的逻辑处理。 如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session.可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.

服务器: 这个 token 是我的吗? 我不信

人生有两个悲剧:第一是想得到的得不到,第二是想得到的得到了

其实token的出现是为了解决sessionId存放的问题

sessionId 在分布式系统, 如果你存放在一台机器, 让一台机器服务负责session相关的存放, 存放单点故障的风险, 这是有状态的, 那么如果用token进行改进的话, 就可以做到无状态了, 但是呢?

给了一个token, 可是服务器怎么认这个token是我颁发给服务器的呢?

在安全认证领域, 登录之后通常会给一个token, 方便浏览器记住用户, 数字签名 token, 服务器是怎么认出是他授予的签名, 我介绍一下服务器是如何认出token和jwt是他授予的签名的

在安全认证领域,Token(令牌)是一种常用的认证机制。通常,在用户登录成功后,服务器会生成一个Token并返回给浏览器。浏览器将此Token存储在本地,并在后续请求中将其附加到请求头中。服务器收到请求后,会验证Token的有效性并据此确定用户身份。JSON Web Token(JWT)是一种常用的Token格式。

服务器如何认出Token和JWT是其授予的签名:

  1. 生成Token时,服务器会使用密钥(例如:对称密钥或非对称密钥对)对Token进行加密或签名。在JWT中,这一过程通常使用HS256、RS256等加密算法完成。

  2. 服务器将生成的Token发送给浏览器。浏览器在后续请求中将Token附加到请求头中。通常,这是通过"Authorization"请求头实现的,格式为 “Bearer ”。

  3. 当服务器收到带有Token的请求时,它会对Token进行验证。这一过程包括解密(对称密钥)或验证签名(非对称密钥对),并检查Token中的有效期、颁发者等信息。

  4. 如果验证成功,服务器会根据Token中的载荷(Payload)识别出用户身份,并处理相应的请求。否则,服务器将拒绝该请求,可能返回401未授权或403禁止访问等状态码。

在Java中,我们可以使用诸如"java-jwt"、"jjwt"等库来处理JWT。以下是一个简单的示例,展示了如何使用"java-jwt"库生成和验证JWT:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtDemo 
    private static final String SECRET_KEY = "my-secret-key";

    public static void main(String[] args) 
        // 生成JWT
        String token = generateJwt("user-id-123");

        // 验证JWT
        try 
            DecodedJWT decodedJwt = verifyJwt(token);
            System.out.println("User ID: " + decodedJwt.getClaim("userId").asString());
         catch (JWTVerificationException e) 
            System.out.println("Invalid JWT!");
        
    

    private static String generateJwt(String userId) 
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.create()
            .withIssuer("auth0")
            .withClaim("userId", userId)
            .sign(algorithm);
    

    private static DecodedJWT verifyJwt(String token) throws JWTVerificationException 
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.require(algorithm)
            .withIssuer("auth0")
            .build()
            .verify(token);
    


在这个例子中,我们使用HMAC256算法和一个对称密钥生成和验证JWT。当然,实际应用中可以根据需求选择其他算法和密钥类型。总之,服务器通过对Token进行解密或验证签名来识别出Token

以上是关于网络应用中session和token本质是一样的吗,有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

cookiesession,token,还在傻傻分不清?

Parallel.Invoke 和 Parallel.ForEach 本质上是一样的吗?

关于token和refresh token

cookiesession,token,还在傻傻分不清?

cookiesession,token,还在傻傻分不清?

为啥 APP 要用 token 而不用