sessioncookietoken工作原理及区别

Posted 小家电维修

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sessioncookietoken工作原理及区别相关的知识,希望对你有一定的参考价值。

1.session、cookie、token工作原理

  Session:保存在服务器上。注册登录->服务端将user存入session->将sessionid存入浏览器的cookie->再次访问时,根据cookie里的sessionid,找到session里的user的状态就可以了。

A.用户第一次请求服务器时,服务器端会生成一个sessionid,通过set-cookie将生成的sessionid返回给客户端

B.客户端收到sessionid会将它保存在cookie中,当客户端再次访问服务端时会带上这个sessionid

C.当服务端再次接收到来自客户端的请求时,会先去检查是否存在sessionid。

(1)不存在就新建一个sessionid,重复1,2的流程,

(2)如果存在就去遍历服务端的session文件,找到与这个sessionid相对应的文件文件中的键便是

sessionid,值为当前用户的一些信息

D.此后的请求都会交换这个 Session ID,进行有状态的会话。

 

  Cookie:保存在浏览器中。

A.客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。

B.客户端浏览器会把Cookie保存起来,

C.浏览器把请求的网址连同该Cookie一同提交给服务器,

D.服务器有对应的api获取这些值,然后根据cookie信息跟踪客户端状态。

 

  Token:一般保存在数据库中。注册登录->服务端基于用户信息与密钥生成一个token->将token+user 返回给浏览器->再次访问时传递token+user+密文数据,后台会再次使用user与密钥生成token,与传递过来的token比较,一致则正确。

A:当用户首次登录成功(注册也是一种可以适用的场景)之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;

B:客户端拿到 token 值之后,进行本地保存。(SP存储是大家能够比较支持和易于理解操作的存储);

C:当客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器;

D:服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值做对比

(1)如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;

(2)如果没有这个 token 值, 则说明没有登录成功.;

(3)如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录.

 

2.cookie与session的区别

1)cookie数据存放在客户端上,session数据放在服务器上。

2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

 

3.cookie和token的区别

1)cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。

2)token 举例:直接给服务员看自己身份证。

 

4.session和token的区别

1)session的使用方式是客户端cookie里存id,服务端session存用户数据,客户端访问服务端的时候,根据id找用户数据。

2)token的使用方式是客户端里存id(也就是token)、用户信息、密文,服务端什么也不存,服务端只有一段加密代码,用来判断当前加密后的密文是否和客户端传递过来的密文一致,如果不一致,就是客户端的用户数据被篡改了,如果一致,就代表客户端的用户数据正常且正确。

 

5.Cookie应用场景

1.会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

2.个性化设置(如用户自定义设置、主题等)

3.浏览器行为跟踪(如踪分析用户行为等)

 

6.Token应用场景

1.用户输入密码和帐号后,系统进行验证后,生成一个session,分配一个sessionid给使用者,后续服务使用者就无需每次都输入密码和验证密码了,只需把对应的帐户和sessionid带上即可,后端只需进行高效的sessionid的有效性校验即可。解决了关键接口或者敏感接口的多次调用,并且对sessionid的有效期等可以进行管理。

2.用户授权中使用,用户输入支付密码后,代表用户已经授权了,这时候系统自动生成一个长度比较长的token串返回给服务使用者,后续进行扣款的时候,则进行验证该token串的合法性即可,注意该串需要保证一定的长度,一次性有效,并且较短的有效期等特点。

3.在开放平台中,对外外部站点的授权服务,用户授权后,同样可以给外部站点发放一个token,后续访问服务的时候,带上该token即可,避免每次均需要进行授权。

4.引申出来的应用,在一个隔离的串行服务调用中,用户完成第一步需要进行一系列的接口调用,然后得出用户是否有权限或者资格进行参加某项服务,接下来,用户调用第二步,而第二步为了安全起见,仍然需要执行第一步的一系列接口调用,这种方式下,可以在第一步合格的用户系统颁发一个token,该token是一次性有效的,实现上,可以在第一次生成一条记录,以用户帐户和token一起为key,第二次进行update该记录来判断。这样的好处是防止两步的调用被隔离带来的风险。

 

转载:https://zhuanlan.zhihu.com/p/445149223

java栈stack和堆heap的工作原理,用途及区别?举例说明

java堆和栈的区别【新手可忽略不影响继续学习】 (视频下载) (全部书籍)

Java中内存分成两种:一种是栈stack,一种是堆heap。

函数中的一些基本类型的变量(int, float)和对象的引用变量(reference)都在函数的栈中,如int a = 5,有个地方先存5,之后再让a指向那个地方。w=new Window(),是w指向Window的首地址。马克-to-win,存取速度快,稍逊于寄存器, 比堆快,

函数执行完后,Java会自动释放掉为函数里变量开辟的栈内存空间,该内存空间可以立即被另作他用。

堆heap内存用来存放由new创建的对象和数组。堆内存,负责运行时(runtime, 执行生成的class文件时)数据,由JVM的自动管理。缺点是,存取速度较慢。

栈中的引用变量指向堆中的对象或数组。

栈中有共享池的概念,(视频下载) (全部书籍)比如下面例子中,sz="hello";在栈中创建一个String对象引用变量sz,然后看看栈中有没有"hello",如果没有,则将"hello"存放进栈,并令sz指向”hello”,如果已经有”hello” 则直接令sz指向“hello”。对于int, float 类型的变量也是一样的有这种共享池的概念,

对于下面程序中:ss0 = new String( "hello" );是用new()来新建对象的,(视频下载) (全部书籍)存于堆中。每调用一次就会创建一个新的对象。当然从节省空间的角度来讲,肯定不如str="hello",有童鞋一定问,那要它有什么用?当时设计编译器时,为什么要设计它?马克-to-win,那我请问你,如果在你编程序时,你还不知道字符串内容怎么办?这时就用到new String(String original),所以,什么都有什么的用处。

(注意不能看调试窗口里value id,eclipse的问题)

技术分享图片

 
本章源码

public class Test
{
    public static void main(String args[]) {
        String str, str1, ss0, ss1, ss2, ss3, ss4;
        str = "hello";
        str1 = "hello";
        ss0 = new String("hello");
        ss1 = new String("hello");
        ss2 = new String("bye");
。。。。。。。。。。。。。。。。。。
详情请见:http://www.mark-to-win.com/index.html?content=JavaBeginner/javaUrl.html&chapter=JavaBeginner/JavaBeginner2_web.html#StackHeapDifference




















以上是关于sessioncookietoken工作原理及区别的主要内容,如果未能解决你的问题,请参考以下文章

按钮开关的工作原理及如何区别作用

按钮开关的工作原理及如何区别作用

java栈stack和堆heap的工作原理,用途及区别?举例说明

USB HOST与 USB OTG的区别及工作原理

消息队列原理及ActiveMQRocketMQRabbitMQKafka区别总结

sessioncookietoken对比