前端要理解的cookies和token的区别

理解Cookie和Session机制,及其安全问题 Cookie和Session的区别?百度一下最常见的就是"Cookie保存在客户端而Session保存在服务端",很多人看了有疑惑,明明Session就在Cookie中啊,为什么这么说?二者到底有啥区别? 一、Cookie# 首先分清Cookies和Cookie Cookies严格来说是个存储空间,是个载体,用提交持久化的信息,浏览器发送HTTP请求时会自动带上此域的所有Cookie,抓包能发现就在HTTP Header中 Cookie就是存储在Cookies中的一条条数据 但当我们说Co. 阅读详情

常用的cookie

互联网服务离不开用户认证,一般流程是下面这样:

  1. 用户向服务器发送用户名和密码
  2. 服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等(可以理解为保存在服务的一个session store中)
  3. 服务器向用户返回一个session_id,写入用户的Cookie
  4. 用户随后的每一次请求,都会通过Cookie,将session_id传回服务器
  5. 服务器收到session_id,找到前期保存的数据(可以理解为去session store中查找),由此而知用户的身份

这种模式的问题在于,拓展性不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求session数据共享,每台服务器都能够读取session。

举个例子,A网站和B网站是同一家公司的关联服务,现在要求,用户只要在其中一个网站登录,再访问另外一个网站就会自动登录,请问如何实现?

一种解决方案是session数据持久化,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的有优点是架构清晰,缺点是工程量比较大。另外如果持久层挂了,就会单点失败。

另一种方案是服务器索性不保存session数据了,所有数据都保存在客户端,每次请求都发回服务器。

JWT就是这种方案的一个代表。

JWT?

JWT的原理是,服务器认证后,生成一个JSON对象,发回给用户,就像下面这样

{
	"姓名": "张三",
	"角色": "管理员",
	"到期时间": "2022年3月24日22:46:32"
}

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

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

JWT的数据结构

实际的JWT大概就像下面这样

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOiI2MjM5ZTU4MWFlNmVjZmM4ZTBhMDNjOTYiLCJpYXQiOjE2NDc5NjE0NzYsImV4cCI6MTY0ODA0Nzg3Nn0.
edkqlsbRY0s1ccAklVFBzufeCTKyPKhVcGslKh2YBt4

它是一个很长的字符串,中间用点(. )分隔成三个部分,注意,JWT内部是没有换行的,这里知识为了方便展示,将它写成了几行。

JWT的三个部分一次如下:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

写成一行就是下面这样

Header.Payload.Signature

Header

header部分是一个JSON对象,描述JWT的原数据,通常是下面的这样子;

{
	"alg": "HS256",
	"typ": "JWT"
}

上面代码中,alg 属性表示签名的算法,默认是HMAC SHA256;
typ 属性表示这个令牌(token)的类型,JWT令牌统一写成JWT;
最后,将上面的JSON对象使用Base64URL算法转成字符串。

Payload

Payload部分也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段供选用:

  • iss: 签发人
  • exp: 过期时间
  • sub: 主题
  • aud: 受众
  • nbf: 生效时间
  • iat: 签发时间
  • jti: 编号

除了官方字段,你还可以在这个部分定义私有字段,下面就是一个例子。

{
 "sub": "1234567890",
 "name": "xia peng",
 "admin": true,
}

注意,JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。这个JSON对象也要使用Base64URL算法转成字符串。

Signature

Signature部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后使用Header里面指定的签名算法(默认是HMAC SHA256),按照下面的公示产生签名。

HMACSHA256(
	base64UrlEncode(header) + "." +
	base64UrlEncode(payload),
	secret
)

算出签名以后,把Header、payload、signature三个部分拼成一个字符串,每个部分直接用(.)分割,就可以返回给用户。
在JWT中,消息体是透明的,使用签名可以保证消息不被篡改,但不能实现数据加密功能

Base64URL

前面提到这个算法,其实这个算法和Base64算法基本类型,但是也有一些小的不同;
JWT作为一个令牌(token),有些场合可能会放到URL(比如xx.xx.com/?token=xx),Base64有三个字符+、/和=,在URL里面有特殊含义,所以要被替换掉: =被省略, +被替换成 -,/替换成_。这就是Base64URL算法。

JWT的使用方式

客户端收到服务器返回的JWT,可以存储在Cookie里面,也可以存储在localStorage。
次后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面:

Authorizaiton: Bearer <token>

另一种做法是,跨域的时候,JWT就放在POST请求的数据体里面。

JWT的几个特点

  1. JWT默认不加密,生成原始Token以后,跨域用密钥再加密一次
  2. JWT不加密的情况下,不能把秘密数据写入JWT
  3. JWT不仅可以用于认证,也可以用于交换信息。有效使用JWT,可以降低服务器查询数据库的次数
  4. JWT的最大缺点是,由于服务器不保存session状态,因此无法在使用过程中废止某个token,或者更改token的权限。也就是说,一旦JWT签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑
  5. JWT本身包含了认证信息,一旦泄露,任何人都可以活的该令牌的所有权限。为了减少盗用,JWT的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  6. 为了减少盗用,JWT不应该使用HTTP协议明码传输,要使用HTTPS协议传输。

下面贴出来JWT在node.js中的使用(express)

// jwt.js 封装的jwt方法
const jwt = require('jsonwebtoken')
const { promisify } = require('util')

exports.sign = promisify(jwt.sign)

exports.verify = promisify(jwt.verify)

// 不验证,直接去返回数据
exports.decode = promisify(jwt.decode)
// user.js 签发token
const jwt = require('../util/jwt')
const { jwtSecret } = require('../config/config.default')

// 用户登录
exports.login = async (req, res, next) => {
    try {
        // 1. 数据验证, validator中间件中已经做了
        // 并且在req.user上挂载了用户信息
        const user = req.user.toJSON()
        // 2. 生成 token
        const token = await jwt.sign({
            userId: user._id
        }, jwtSecret, {
            expiresIn: 60 * 60 * 24 // token的过期时间
        })
        // 3. 发生成功的响应(包含token的用户信息)
        delete user.password
        res.status(200).json({
            ...user,
            token
        })
    } catch (err) {
        next(err)
    }
}
// 验证token的中间件
const { verify } = require('../util/jwt')
const { jwtSecret } = require('../config/config.default')
const { User } = require('../model')

/**
 * 验证token是否有效,并挂载用户信息
 * @param {*} req 
 * @param {*} res 
 * @param {*} next 
 * @returns 
 */
module.exports = async (req, res, next) => {
    let token = req.headers['authorization']
    token = token ? token.split('Bearer ')[1] : null

    if (!token) {
        return res.status(401).end()
    }

    try {
        // verify方法会验证token是否有效 token是否过期
        const decodedToken = await verify(token, jwtSecret)
        // 认证完token 并将用户信息挂载在req.user上
        req.user = await User.findById(decodedToken.userId)
        next()
    } catch (err) {
        return res.status(401).end()
    }
}
ESP32-CAM搭建Arduino及简单使用 配置环境 方法一 文件 → 首选项 http://wechat.doit.am/package_esp8266com_index.json https://dl.espressif.com/dl/package_esp32_index.json 工具 → 开发板 → 开发板管理器 等待安装 方法二 https://github.com/espressif/arduino-esp32 Arduino安装目录下,找到hardware文件夹 建立文件夹espressif,然后在里面再建立一个esp32文件夹 阅读详情

相关推荐

win11重装系统简易教程-小白也可以上手!

本文介绍一下win11系统重装的各个步骤,也作为记录供自己后面查看。附上我之前参考的一位知乎大神写的重装win10系统文章的地址本文用到的工具全部是,不需要下载第三方镜像文件(不是说这个不好,只是第三方的软件或镜像文件网上非常多,琳琅满目,小白需要筛选甄别,直接用官方的就比较省心,大神请自便~)

Sddqa的博客 1万+

前端笔记:cookie和token的区别

cookie和token的区别cookie和token的区别是什么区别 cookie和token的区别 是什么 Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。 https://leetcode-cn.com/leetbook/read/tech-interview-cookbook/or674t/

NA_TSU_ME的博客 6969

DNS入侵检测 datacon2020

DNS入侵检测 datacon2020。

weixin_51491521的博客 522

前端架构处理Cookie、Session、Token

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器再发起请求时,被携带并发送到服务器上。通常 Cookie 用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。会话状态管理(如用户登录状态、购物车等其它需要记录的信息)个性化设置(如用户自定义设置、主题等)浏览器行为跟踪(如跟踪分析用户行为等)

ejinxian的专栏 1366

logisim计组实验八 乘法器

原理:点这里 有问题欢迎留言哦~ 文章目录五位阵列乘法器电路图时间延迟分析六位补码阵列乘法器五位无符号乘法流水线原理图电路图原码一位乘法器原理图电路图补码一位乘法器 五位阵列乘法器 电路图 此处注意:全加器FA的cout端是进位端而非输出端 使用硬件控制比循环累加的速度快得多。 但是存在串行进位链 改进版: 时间延迟分析 T是计算相加数的一级门延迟 3n–>2n 性能差别在1.5倍 ...

treblez's blog 2万+

SAP Retail 补货里的 Requirement Groups,站点和商品太多时,主数据维护如何做减法

SAP Retail补货主数据设计中,Requirement Groups(需求组)是常被低估但至关重要的分类机制。它通过将具有相同补货需求的接收方(如门店)按商品分类(Merchandise Category)分组,大幅降低主数据维护量。在大型零售场景中(如800家门店、6万商品),直接维护每个门店和商品的组合参数会导致维护量失控。Requirement Groups允许企业按品类特性(如乳制品、饮料等)为不同门店组设置统一补货参数,并随业务变化灵活调整。该机制与商品分类紧密绑定,不同于MRP Group

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 67

【前端知识】Cookie, Session,Token和JWT的发展及区别(一)

最通俗的关于Cookie, Session,Token和JWT的相关笔记和理解。在上章笔记中主要介绍一下背景和Cookie。包括Cookie的定义,特点,重要属性,优缺点,作用和使用场景,以及如何解决禁用问题,以及Cookie在客户端和服务端的相关操作。 上章:主要介绍背景和Cookie 中章:主要介绍一下Session并总结一下Cookie和Session。 下章:主要介绍Token的相关定义及理解。 终章:主要介绍JWT并总结JWT和Token的区别,以及总结Cookie到Token的区别与发展。

xiaobaizaza_Ry的博客 2180

081、LLC谐振变换器的短路特性与保护

本文深入分析了LLC谐振变换器在短路工况下的特性与保护策略。作者通过实际案例指出,LLC在输出短路时会出现谐振电流失控、ZVS条件丧失等危险现象,导致MOS管炸毁。文章详细阐述了短路保护的三大难点:响应速度、频率与电流的耦合、重启策略,并提出了硬件级快速保护、频率快速拉升、打嗝模式等实用解决方案。作者分享了关键参数设计经验,包括电流检测阈值设置、最高频率限制和保护响应时间控制,并通过实测波形验证了保护效果。最后总结出五点重要经验,强调硬件保护的必要性和系统设计的注意事项,为LLC变换器的短路保护设计提供了有

Jack010169的博客 75

网络请求中,token和cookie有什么区别?

2、cookie是HTTP标准,跨域限制,配合session使用,而token无标准,自定义传递,无跨域限制,用于JWT(也就是说cookie不用管它,自动传递,但是token不行,需要明确地传值才可以传过去,token就像一个参数,不加就不传,cookie是只要域名符合,不跨域就会自动传)4、 最初使用官方的cookie解决登录验证问题,但是cookie问题太多,出现了来自民间的Token解决方案,cookie比较学院派,token比较灵活的。

weixin_43850639的博客 1716

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 494

iStoreOS路由器(openwrt软路由) AdGuard Home 客户端 IP 总是 localhost(127.0.0.1)?这样设置让你精准识别真实IP!

在iStoreOS等软路由上部署AdGuard Home时,客户端IP常显示为localhost(127.0.0.1)。本文详细介绍如何让adguardhome直接识别客户端真实IP🌐,帮助你实现网络流量的精准追踪和管理。🔍

XiaoqiangClub的博客 2249

登录的两种验证方式的区分:cookie和token

测试小伙伴出去面试,经常会被问到你们项目登录验证是用的哪种验证方式,不同的验证方式又有哪些区别?下面就有我来问大家讲解一下,下次遇到这种问题就不慌了。前端只需要把用户名和密码传递给后端,后端收到验证成功后,通过他们内置的方式,存入session中,会生成一个唯一的标识,并通过设置响应头,回传给前端。如下图所示。浏览器如果发现响应头中有Set-Cookie,则默认在本地设置Cookie信息,并且后续发送请求时,会在请求头里自动带上cookie的信息,如下图:这样就完成了cookie校验。...

m0_73120712的博客 2607

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

session,token,cookies到底有什么区别和联系

session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session,依赖cookie。cookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。token也类似一个令牌,无状态,用户信息都被加密到token中,服务器收到token后解密就可知道是哪个用户,需要开发者手动添加。

m0_62469731的博客 630

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Token、Session、Cookies是什么?如何理解其不同?一文带你了解

Session Cookies 也称为会话 Cookies,在 Session Cookies 中,用户的登录状态会保存在服务器的内存中。当用户登录时,Session 就被服务端安全的创建。在每次请求时,服务器都会从会话 Cookie 中读取 SessionId,如果服务端的数据和读取的 SessionId 相同,那么服务器就会发送响应给浏览器,允许用户登录。1、 Session 是在服务端的,用来存储用户的信息;

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 255

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【前端知识】Cookie, Session,Token和JWT的发展及区别(三)

最通俗的关于Cookie, Session,Token和JWT的相关笔记和理解。在下章笔记中主要介绍一下主要介绍Token。包括Token的定义,特点,重要属性,优缺点,作用和使用场景。 上章:主要介绍背景和Cookie 中章:主要介绍一下Session并总结一下Cookie和Session。 下章:主要介绍Token的相关定义及理解。 终章:主要介绍JWT并总结JWT和Token的区别,以及总结Cookie到Token的区别与发展。

xiaobaizaza_Ry的博客 1255

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

请问token和cookie有啥区别?后台为啥不要token但是要cookie?难道cookie不是包裹token的容器?

本文对比了Token与Cookie的本质区别:Token是身份凭证(如JWT字符串),而Cookie是存储和传递Token的浏览器机制。从工作流程看,Token需要前端手动管理(存储、添加请求头等),而Cookie通过Set-Cookie自动完成认证传递。安全性方面,配置HttpOnly和Secure的Cookie能有效防御XSS攻击,但需防范CSRF;前端管理的Token则易受XSS威胁但免疫CSRF。后台建议使用Cookie方案的核心原因在于简化前端工作(浏览器自动处理)、提升安全性(后端控制凭证)及适

qq_71214810的博客 1123

Cookie、Session和Token的区别与联系

以下是本人的一些笔记,助于理解概念,并不详细,详细内容可以参考文中提供的链接。 一、HTTP的无状态性 HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理。 假设要求登录认证的Web页面本身无法进行状态的管理(不记录已登录的状态),那么每次跳转新页面不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态。 不可否认,无状态协议当然有它的优点。由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗。从另一个角度来讲,也正是因为HTTP协议

小菜鸡的博客 3686

浅谈Token的理解与机制运用

一、定义概念 Token被翻译成为('令牌','标记')在计算机中的含义也差不错('计算机身份认证安全令牌'),token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。 二、传统的Seeion验证 Http协议进行数据的提交,服务器接收到用户帐号和密码进行验证,在之后的一系列操作,因为http协...

ShIcily的博客 1037

为什么你的 Token 不该由前端存储?—— 深入理解 HttpOnly Cookie 与前端 Cookie 的安全差异

HttpOnly Cookie是防范XSS攻击窃取Token的关键方案,通过禁止JavaScript访问敏感Cookie,有效提升前端安全性。相比前端直接存储Token(如localStorage或document.cookie),HttpOnly Cookie由后端通过Set-Cookie头设置,浏览器自动携带但禁止JS读取,彻底阻断XSS窃取路径。实现时需前后端协作:后端配置httpOnly、Secure等属性,前端启用withCredentials跨域携带。

专注前端开发领域,深耕 Python AI Agent应用开发,热爱探索 Web 与人工智能的前沿技术。 683

小白学 Python 爬虫(10):Session 和 Cookies

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置...

爱无止 526

php 谈谈我对session, cookies和jwt的理解

最近在做项目重构,因为核心功能仅以restful风格接口提供,因此对于会话管理这一部分,目前考虑使用jwt(Json Web Token)。本文是我在项目开发过程中对这几种会话管理技术理解的一些总结。不对之处,请指正。为什么我们需要会话管理众所周知,HTTP协议是一个无状态的协议,也就是说每个请求都是一个独立的请求,请求与请求之间并无关系。但在实际的应用场景,这种方式并不能满足我们的需求。举个大家...

mengzuchao的专栏 766

前端把cookie写在父域里_Cookie、Session、Token那点事儿

前言:新公司项目中使用到了Cookie,在各大Android技术讨论群向前辈们取经讨论这cookie、session、token这仨哥们的时候,很多开发者说法不一各抒已见,所以是时候回顾下http基础以及总结开发经验了。本文重在科普分析Cookie、Session、Token的基本概念和应用场景;Okhttp框架下对Cookie的管理使用。文章如果写的不好请各位开发者老司机私聊或者在评论区指点提出...

weixin_36373949的博客 370

谈谈我对session, cookies和jwt的理解

谈谈我对session, cookies和jwt的理解 时光过去了心还在原地 关注2018.01.17 10:34* 字数 2121 阅读 875评论 12喜欢 26最近在做项目重构,因为核心功能仅以restful风格接口提供,因此对于会话管理这一部分,目前考虑使用jwt(Json Web Token)。本文是我在项目开发过程中对这几种会话管理技术理解的一些总结。不对之处,请指正。为什么我们需要会...

weixin_40592935的博客 537

Cookie,localStorage与sessionStorage,token理解与使用

Cookie,localStorage与sessionStorage,token

m0_63989259的博客 369

Cookie、Session和Token

Cookie、Session和Token

weixin_44479862的博客 1052
上一篇: Event Loop、宏任务、微任务到底什么关系?
下一篇: 项目中使用了Hash路由时如何同时使用锚点?
Whoopsina
博客等级 码龄7年 26粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whoopsina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值