最近在用Laravel搞一个API项目,主要是给前端提供用户认证和数据查询功能,用的Laravel的Sanctum做token认证。...排查发现是会话管理的问题,Redis存session居然不稳定,这坑让我熬了两天,今天给你讲讲咋挖出来的!...技术环境框架:Laravel10.15认证:LaravelSanctum3.2缓存/会话:Redis7.0(viapredis/predis2.2)数据库:MySQL8.0.34部署:Docker,Kubernetes1.27...端点,用户登录后返回Sanctum的token,前端带着token访问/api/user获取用户信息。...这坑让我对Laravel的会话管理和Redis的高并发场景有了新认识,生产环境果然是炼金场!
它包括以下组件: 登录与注册功能 邮箱验证 双重认证 会话管理 通过Laravel Sanctum提供API支持 Laravel Jetstream取代了旧版Laravel中可用的Laravel认证UI...(), // Features::teams(), ], Laravel Jetstream 安全(Security) Laravel Jetstream带有允许用户更新密码并注销的标准功能...但是,更令人印象深刻的是,Jetstream还提供带有QR码的双重身份验证,用户可以直接启用和禁用。 另一个出色的安全功能是用户也可以注销其他浏览器会话。...API Laravel Jetstream使用Laravel Sanctum提供简单的基于令牌的API。...使用Sanctum,每个用户都可以生成具有特定权限的API令牌,例如创建,读取,更新和删除。
值得庆幸的是,Laravel 可以轻松保护您的应用程序免受跨站点请求伪造(CSRF)攻击。...通过Laravel 用户认证我们知道了web 浏览器认证和API 认证,基于此我们今天总结下 CSRF 保护 漏洞的解释 如果您不熟悉跨站点请求伪造,我们讨论一个利用此漏洞的示例。...为了防止这种漏洞,我们需要检查每一个传入的 POST,PUT,PATCH 或 DELETE 请求以获取恶意应用程序无法访问的秘密会话值。...API 应用 没有这玩意。 不依赖 cookies 做安全验证的话,则不需要预防 CSRF。...CSRF 攻击关键在于 cookie,如果 cookie 里不含登陆令牌,你把登录令牌放到 header 里就没问题。因为 CSRF 所利用的 form 和四个特殊 tag 都无法添加 header。
: 可预测的令牌:如果令牌使用时间戳或简单算法生成,可能被预测 令牌不与会话绑定:如果令牌不与特定用户会话关联,可能被重用 令牌未验证完整性:如果不验证令牌的完整性,可能被篡改 4.2.3 令牌验证逻辑错误...基于前面章节的详细讨论,以下是防御CSRF攻击的最佳实践汇总: 9.1.1 核心防御机制 实施CSRF令牌 为每个用户会话生成唯一的、加密安全的令牌 在所有状态改变的请求中验证令牌 确保令牌绑定到用户会话...9.1.3 后端安全实践 全面的令牌验证 实现中间件统一处理CSRF验证 验证令牌的有效性、完整性和所有权 处理验证失败的情况,安全地拒绝请求 安全的会话管理 生成强随机的会话标识符 设置适当的会话过期时间...7.4.3 Laravel API路由与CSRF保护 对于API路由,Laravel提供了不同的认证机制,通常不需要CSRF保护: // routes/api.php Route::middleware...success']); } } 7.4.4 Laravel CSRF防御最佳实践 不要过度排除路由:仅对必要的路由排除CSRF保护 使用Sanctum等API认证方式:为API路由提供合适的认证
所以,我们就需要session management会话管理! ---- 会话管理的基本方式 会话管理的基本主要有隐藏域,cookies,与URL重写这几种实现方式。用得较多的是后两种。...对于客户的第一个请求,容器会生成一个唯一的会话ID,并通过相应把它返回给用户,客户在以后发回一个请求中发回这个会话ID,容器看到ID之后,就会找到匹配的会话,并把这个会话与请求关联。...我们来看看容器在背后默默为我们做了什么: 建立新的httpsession对象 生成唯一的会话ID 建立新的会话对象 把会话ID与cookie关联 在响应中设置cookie cookie所有的工作都在后台进行...if(请求包含一个会话ID) 找到与该ID匹配的会话 else if(没有会话ID或者没有匹配的ID) 创建一个新的会话。...** 由于session在用户关闭浏览器后,会话结束,就会消失,cookie随之应该也会消失。但servlet的API中提供了一些方法,可以让客户端的cookie存活的时间更久一点。
所有的 Laravel 路由都在 routes 目录中定义,这些文件都由框架自动加载。routes/web.php 文件用于定义 web 界面的路由。...这里面的路由会被分配给 web 中间件组,它提供了会话状态和 CSRF 保护等功能。 定义在 routes/api.php 中的路由都是无状态的,并且被分配了 api 中间件组。...大多数的应用构建,都是以在 routes/web.php 文件定义路由开始的。可以通过在浏览器中输入定义的路由 URL 来访问 routes/web.php 中定义的路由。...在这个路由组中,将自动应用 /api URI 前缀,所以你无需手动将其应用于文件中的每个路由。你可以通过修改 RouteServiceProvider 类来修改前缀和其他路由组选项。...在app\Providers\RouteServiceProvider.php 中修改API路由的前缀Route::prefix('api') ?
问题在于,对 JWT 的大多数解释都是技术性的,这一点让人很头疼。 让我们看下,我能否解释清楚 JWT 是如何在不引起你的注意下保护您的 API ! API 验证 某些 API 资源需要限制访问 。...." + base64UrlEncode(payload), "secret string" ); 下面是对这里发生的情况做解释: 首先, HMACSHA256 是哈希函数的名称, 并带有两个参数...认证过程 因此,现在您对令牌的创建方式有了一个很好的了解。您如何使用它来验证您的API? 登录 用户登录时会生成令牌,令牌会与用户模型一起存储在数据库中。...当服务器收到带有授权令牌的请求时,将发生以下情况: 1.它解码令牌并从有效载荷中提取ID。 2.它使用此ID在数据库中查找用户。 3.它将请求令牌与用户模型中存储的令牌进行比较。.../dwyl/learn-json-web-tokens 原文链接:https://learnku.com/laravel/t/40490
sf.getCurrentSession(); 创建session或取出session对象 3:Session: 3.1:session对象维护了一个连接(Connection), 代表了与数据库连接的会话...a:保存的方法:session.save(对象); b:更新的方法:session.update(对象); 注意:更新必须写上主键的名称,其他字段都要设置值; c:主键查询的方法...3.4:Transaction:hibernate事务对象; 使用Hibernate api 之常见的类(配置类,会话工厂类,会话类)案例: 《这里只是列举了Hibernate的三个常见类,其他配置文件和实体类之前的博客写过...//关闭事务 51 session.close(); 52 sf.close(); 53 } 54 55 } Hibernate三个常见类,配置类,会话工厂类...,会话类,over!!!
我们还将使用 API 为用户产品创建功能齐全的 CRUD 应用。 在使用跨平台应用程序时, API 是一个非常不错的选择。除了网站,您的产品可能还有 Android 和 iOS 应用程序。...在这种情况下, API 也是同样出色的,因为您可以在不更改任何后端代码的情况下编写不同的前端。...说明 我们先写下我们的应用程序详细信息和功能。我们将使用 JWT 身份验证在 laravel 中使用 restful API 构建基本用户产品列表。...对于 Laravel 5.5 或以上版本 ,运行下面的命令来生成密钥以便用于签发令牌。...然后调用 authenticate 方法,该方法返回经过身份验证的用户。最后,返回带有用户的响应。 身份验证部分现在已经完成。
在每个后续请求中,由于用户数据存储在服务器上,服务器需要找到该会话并对其进行反序列化。 基于服务器的认证的缺点 难以扩展:服务器需要为用户创建一个会话并将其保存在服务器上的某个位置。...如果我们有一个分布式系统,我们必须确保我们使用一个不耦合到应用服务器的单独的会话存储。...然后,服务器验证令牌,如果它有效,则将安全资源返回给客户机。 基于token认证的优点 无状态,易于扩展:token包含用于标识用户的所有信息,从而消除了对会话状态的需要(即,无需会话状态)。...安全性:由于我们没有使用cookies,我们不必再防御网站的跨站点请求伪造(CSRF)攻击。...subdomain with restricted access.']; }); }); AngularJS前端示例 我们使用AngularJS作为前端,依赖Laravel后端身份验证服务器的API
请避免使用版本号作为你的前缀或子域,因为版本控制是通过 header 头 Accept 处理的。 子域名API_DOMAIN 比如可以用api.z5w.net来做api的调用地址。...如果已经设置了前缀prefix,则domain一般设为null 版本号version 这个版本号是你的 API 的默认版本号,并且会在一些未提供版本号的情况下作为回调的默认值使用。...在生成 API 文档时也会使用这个版本号作为默认值。 名称Name 你的 API 的名称只会在你使用 API Blueprint 命令生成文档的时候使用。...条件请求CONDITIONAL_REQUEST 『条件请求』默认为开启状态,这有利于客户端的缓存机制在可能的情况下缓存 API 请求。.../helloworld,看看是不是出现了api的json数据呢?
因为带有 Secure 的 Cookie 一般也不用于传输敏感数据....关于这个主题似乎有很多困惑,因为JWT中的基于令牌的身份验证似乎要取代“旧的”、可靠的模式,如基于会话的身份验证。 来看看 cookie 在这里扮演什么角色。...之所以称为基于会话的会话,是因为用于用户识别的相关数据存在于后端的会话存储中,这与浏览器的会话存储不同。 何时使用基于会话的身份验证 只要能使用就使用它。...想要针对API进行身份验证的前端应用程序的典型流程如下: 前端将凭证发送到后端 后端检查凭证并发回令牌 前端在每个后续请求上带上该令牌 这种方法带来的主要问题是:为了使用户保持登录状态,我将该令牌存储在前端的哪个地方...如果你确实要使用JWT而不是坚持使用基于会话的身份验证并扩展会话存储,则可能要使用带有刷新令牌的JWT来保持用户登录。 总结 自1994年以来,HTTP cookie一直存在,它们无处不在。
Cookies 是一种存储机制,分享一套 181G视频的Java架构师课程,累计更新时长1000+个小时,然而 JWT Tokens 是被加密并签名后的令牌。...Redis服务器用于存储Session即可; 3、「在多集群内运行多台服务器」:会话保持(又称:粘滞会话); 以上所有场景在现有软件系统内都具备良好的支持,你的应用需要进行特殊处理的可能性基本为零。...实际上,签名后的 Cookies 比未签名的 Cookies 同样更加安全,但这绝不是 JWT 独有的,优秀的 Session 实现均使用签名后的 Cookies(译者注:例如 Laravel)。...译者注:实际上,Laravel Passport 便是使用类似「有状态 JWT」的方式来存储 OAuth Access Token。...JWT适合做什么 在本文之初,我就提到 JWT 虽然不适合作为 Session 机制,但在其它方面的确有它的用武之地。该主张依旧成立,JWT 特别有效的使用例子通常是作为一次性的授权令牌。
PHP的内置会话功能,而是实现了一种更灵活、更强大的会话机制。...此外,还有一个大家都很困惑的问题。无法在Larravel的控制器构造函数中获取应用程序会话数据。这是因为Larravel的会话是通过StartSession中间件启动的。...在生产环境中,可以考虑使用Memcached或Redis驱动程序来获得更好的会话性能,特别是当同一个在线应用程序部署到多台机器时。这是最佳实践。 会话驱动程序用于定义所请求的会话数据的存储位置。...Larave可以处理多种类型的驱动程序: 文件–会话数据存储在存储/框架/会话目录中; Cookie–会话数据存储在已安全加密的Cookie中; 数据库–会话数据存储在数据库中 Memcached...要向Larravel会话的后端添加其他驱动程序,可以在会话外观上使用extend方法。
使用过Laravel的开发者都知道,Laravel自带了一个认证系统来提供基本的用户注册、登录、认证、找回密码,如果Auth系统里提供的基础功能不满足需求还可以很方便的在这些基础功能上进行扩展。...例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。...web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api...例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。 提供器中定义了该如何从持久化的存储数据中检索用户。...* 通过Cookies中的"remeber me"令牌和用户唯一ID获取用户数据 * @param mixed $identifier * @param string
首先需要说明 很多人错误地尝试比较 Cookies 和 JWT。这种对比毫无意义,就像对比内存和硬盘一样。Cookies 是一种存储机制,然而 JWT Tokens 是被加密并签名后的令牌。...「运行多台服务器」 :只需一台专用的 Redis 服务器用于存储 Session 即可。 「在多集群内运行多台服务器」 :会话保持(又称:粘滞会话)。...实际上,签名后的 Cookies 比未签名的 Cookies 同样更加安全,但这绝不是 JWT 独有的,优秀的 Session 实现均使用签名后的 Cookies(译者注:例如 Laravel)。...译者注:实际上,Laravel Passport 便是使用类似「有状态 JWT」的方式来存储 OAuth Access Token。...在本文之初,我就提到 JWT 虽然不适合作为 Session 机制,但在其它方面的确有它的用武之地。该主张依旧成立,JWT 特别有效的使用例子通常是作为一次性的授权令牌。
会话管理:Token 使得应用能够维持用户的会话状态,例如在一段时间内保持用户处于登录状态。 权限控制:通过在 Token 中嵌入用户的权限信息,应用可以轻松判断用户是否有权访问某些资源。...正则中的模式表示应用环境可能是 kzone 或带有环境后缀(如 -dev、-test 等)的域名。...HttpOnly 阻止 JavaScript 访问 Cookies,Secure 使得 Cookies 只能在 HTTPS 连接中传输。...设置过期时间:Token 设置合理的过期时间,并定期刷新,确保用户会话的安全性。...跨站请求伪造(CSRF)防护:使用带有唯一令牌的 POST 请求或验证请求来源,减少 CSRF 攻击风险。
OAuth 2.0 看起来像: 用户名 + 密码 + 访问令牌 + 过期令牌 工作原理: OAuth 2.0 标准的核心思想是,用户使用用户名和密码登录系统后,客户端(用户访问系统的设备)会收到一对令牌...,这是一个访问权限令牌和刷新令牌。...访问令牌用于访问系统中的所有服务。到期后,系统使用刷新令牌生成一对新的令牌。所以,如果用户每天都进入系统,令牌也会每天更新,不需要每次都用用户名和密码登录系统。...刷新令牌也有它的过期时间(虽然它比访问令牌长得多),如果一个用户一年没有进入系统,那么很可能会被要求再次输入用户名和密码。...它的思路是,当你创建亚马逊帐户的时候,会生成一个永久的、非常安全的访问令牌,你要非常小心地存储起来并且不要给任何人显示。
Session是服务器端的一种机制,用于存储特定用户会话所需的信息。...('https://httpbin.org/cookies/set/sessioncookie/123456789')print("首次请求后的Cookies:", session.cookies.get_dict...print("会话Cookies:", session.cookies.get_dict()) # 访问需要登录的页面 profile_response =...handle_csrf_login(login_url, username, password): """ 处理带有CSRF令牌的登录表单 """ session = requests.Session...实际案例:爬取需要登录的网站下面是一个完整的示例,演示如何爬取需要登录的网站并保持会话状态。