Nginx lua设置Cookie,及学习Cookie

2023-05-16

网上看到这篇文章,很喜欢这种分析思路,这里学习记录一下。

最近小了解了下cookie. 以前觉得cookie无非就是一连串键值对, 在深入了解之后发现 远没自己想的那么简单, 自己果真太肤浅了….

好吧, 这里主要探讨一下以下几个问题:

  1. 如何正确设置cookie
  2. cookie的作用域以及超时时间
  3. 第一方cookie以及第三方cookie

为了获得简单直观的感受, 这里我们使用以下工具进行探索:

  • openresty(主要是依赖nginx + ngx_lua), 用于设置cookie和简单的输出
  • chrome浏览器, 用于查看cookie以及相应的http头

准备工作

好, 假设我们现在有两个域名, 三个网站, 然后利用他们来进行实验

  • orz.net
  • sub.orz.net
  • coolkid.net

首先我们准备一个简单的html页面:

orz.net

<h1>this is orz.net</h1>
<br/>

<h2>this is orz.net</h1>
<iframe width="1024px" height="80px" src="http://orz.net/echo_cookie"></iframe>
<br/>

<h2>this is sub.orz.net</h2>
<iframe width="1024px" height="80px" src="http://sub.orz.net/echo_cookie"></iframe>
<br/>

<h2>this is coolkid.net</h2>
<iframe width="1024px" height="80px" src="http://coolkid.net/echo_cookie"></iframe>

然后准备好两个lua脚本, 一个用于打印cookie(echo_cookie.lua), 一个用于设置cookie(set_cookie.lua):

echo_cookie.lua 打印cookie

function get_cookie(s_cookie)
    local cookie = {}

    -- string.gfind is renamed to string.gmatch
    for item in string.gmatch(s_cookie, "[^;]+") do
        local _, _, k, v = string.find(item, "^%s*(%S+)%s*=%s*(%S+)%s*")

        if k ~= nil and v~= nil then
            cookie[k] = v
        end
    end

    return cookie
end

function print_cookie(cookie)
    for k, v in pairs(cookie) do
        ngx.say(k .. " : " .. v .. "</br>")
    end
end

ngx.header['Content-Type'] = 'text/html'

local raw_cookie = ngx.req.get_headers()["Cookie"]
if raw_cookie == nil then
    ngx.say "no cookie found"
else
    print_cookie(get_cookie(raw_cookie))
end

     设置cookie的代码比较简单, 直接给ngx.header['Set-Cookie']赋值即可. 之后我们主要就是修改这个文件, 通过修改设置来观察发送Cookie的情况.

接下来准备一下nginx配置文件:

nginx配置文件

# 记得include进来
server {
    listen 80;
    server_name orz.net sub.orz.net coolkid.net;
    access_log "logs/cookie.log";

    location / {
        root html;
        try_files $uri /orz.html;
        header_filter_by_lua_file script/set_cookie.lua;
    }

    location /echo_cookie {
        content_by_lua_file script/echo_cookie.lua;
    }
}

接着我们改一下hosts文件, 将上述三个网站都指向本地

add hosts

# learn cookie
127.0.0.1 orz.net sub.orz.net coolkid.net

好了, 最后使用浏览器访问下orz.net/orz.html, 看看效果:

 

开始进行尝试吧;)

设置cookie

一开始我对cookie的观点停留在:

  • cookie就是一个个键值对
  • 服务器端通过返回Set-Cookie头设置cookie
  • 客户端将cookie放到Cookie头中

好, 接下来我想在orz.net中设置3个键值对, 第一个蹦出来的(错误)想法是:

set_cookie.lua

ngx.header["Set-Cookie"] = "perl=1; python=2; ruby=3"

我们通过chrome看看结果:

responserequest after response

结果和预期有很大的出入. 虽然Set-Cookie头设置好了, 但是再次请求时仅仅设置了头一个变量, 剩下的两个均被丢弃了. 好吧, 遇到这种情况说明自己以前的观点是错误的, 那我们就从定义开始学习呗, 细心读一下wiki

仔细读了一下, 了解到一个Set-Cookie只能设置一个键值对. 好, 我们改一下set_cookie.lua的代码, 让它设置多个Set-Cookie头:

set-cookie.lua

ngx.header['Set-Cookie'] = {
    "perl=1",
    "python=2"
}

再次访问, 我们得到了想要的结果.

 

注意到cookie只在当前域名下生效. 这里就牵扯到cookie的属性设置了

If not specified, they default to the domain and path of the object that was requested.

我们再改一下代码, 让部分cookie可以在其他域名生效:

set_cookie.lua

ngx.header['Set-Cookie'] = {
    "perl=1",
    "python=2; domain=.orz.net; path=/",
    "ruby=3; domain=coolkid.net; path=/"
}

看下结果:

 

到了这里, 我似乎明白点了什么:

  • 通过设置domain可以控制cookie传递范围
  • cookie貌似是不能跨不同域设置的, 但可以跨子域

      当然, 有关跨域共享cookie的问题网上有很多讨论, 例如利用js向第三方域发送cookie. 当然如果有人在网站上插一段类似代码, 就可以对cookie进行截获. 通过使用属性HttpOnly即可避免.

      最后再提一点: 默认设置的cookie都是在关闭浏览器后失效的.

第一方cookie和第三方cookie

      网上讨论这个也有很多, 但个人觉得没有一个讲得特别清楚….

      从我个人理解出发: 一个cookie从属于一个域. 当访问这个域的时候就会发送相应的cookie. 好, 假设一个网站包含了一个第三方的image(例如taobao的图片), 当我们用浏览器访问这个网站的 时候, 浏览器会自动请求这个第三方的图片, 如果这个请求返回的结果中带了相应的Set-Cookie, 那么浏览器就设置了这个第三方的cookie. 相对你访问的目标网站, 这个第三方设置的cookie即为 第三方cookie.

个人比较推荐禁止第三方cookie.

有关cookie的其他信息, 例如安全性等, 还是强烈推荐阅读wiki

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx lua设置Cookie,及学习Cookie 的相关文章

随机推荐

  • ANDROID CMAKE DEBUG的记录

    android 如果使用DEBUG模式 xff0c CMAKE编译的SO是DEBUG版本的 xff0c 会造成性能下降 但是使用RELEASE编译的SO xff0c 使用DEBUG模式 xff0c JNI的速度不会变化 终于知道为什么 xf
  • window下使用vnc远程登录linux图形界面和运行应用程序 和odroid Xu4开发板的使用和视频接口VGA、DVI、HDMI的联系

    注 xff1a 自己曾经尝试过很多次使用VNC远程登录odroid XU4的开发板 xff0c 但是连接后均显示未解码的连接 xff0c 刚开始烧写的是odroid官方的ubuntu系统 xff0c 我靠 xff0c 就是因为烧写了这个坑爹
  • Putty的ppk文件转成Xshell使用的key文件

    Putty的ppk文件转成Xshell使用的key文件 今天同学给我一个Putty远程登录使用的ppk文件 xff08 即后缀名为ppk xff09 让我远程登录主机 xff0c 但是我用的是Xshell xff0c 导入这个ppk文件时
  • GD32串口读取GPS模块数据并解析经纬度教程-附完整代码和资料文件

    前言 xff1a 最近入手了个GPS模块 xff0c 手上只有GD32的开发板 网上有很多使用STM32库函数的GPS驱动程序 xff0c 但是基于GD32库函数读取GPS驱动的教程居然一篇都没有 所以为了学习GD32库的同学 xff0c
  • opencv 所有lib文件

    今天在vs上写一段代码 xff0c 编译后总是显示有无法解析的函数 xff0c 又不知道该函数在哪个lib文件中 xff0c 在百度上找了半天 xff0c 也没找到 已是就将所有lib库都添加到vs链接中 如下 xff1a opencv c
  • Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程1 线程 进程 多线程概述2 创建线程 xff08 重点 xff09 2 1 继承Thread类 xff08 Thread类也实现了Runnable接口 xff09 2 2 实现Runnable接口 xff08 无消息返
  • Java网络编程(两种聊天室:TCP和UDP)

    网络编程 您的导航 网络编程网络编程基础知识一 网络编程三要素IP地址端口协议 二 IP地址与InetAddress类IP地址分类InetAddress类三 端口 xff08 Port xff09 与 InetSocketAddressIn
  • 免费发布一个网站(保姆级图文教程)

    利用GitHub Pages发布一个网页 第一步 xff1a 注册一个github账户 访问官网 点这两个都可以注册 根据提示输入一些信息 xff0c 然后创建账户 xff1a 然后你会收到一封邮件 xff0c 输入验证码或是打开邮件的验证
  • 修改键盘映射、交换按键

    修改键盘映射 交换按键 导航 修改键盘映射 交换按键写在前面一 创建配置文件二 修改键盘映射三 重启四 键位表 写在前面 这两天买了个黑爵的小键盘 xff0c del和ins键是同一个键 xff0c 通过fn来区分 xff08 我的笔记本电
  • Spring Cloud Gateway(黑马springcloud笔记)

    Gateway 目录 Gateway一 为什么需要网关二 gateway入门三 断言工厂四 过滤器工厂五 全局过滤1 实现2 过滤器执行顺序 六 跨域问题 一 为什么需要网关 不能让外部能够直接访问微服务 xff0c 而是需要通过网关访问
  • Docker(黑马spring cloud笔记)

    Docker 目录 Docker一 介绍和安装1 安装2 启动3 镜像加速 二 Docker基本操作1 镜像操作2 容器操作3 数据卷操作 三 Dockerfile1 镜像结构2 Dockerfile 四 Docker Compose1 安
  • RabbitMQ(黑马spring cloud笔记)

    MQ 目录 MQ一 同步通讯和异步通讯1 同步通讯2 异步通讯 二 RabbitMQ1 部署2 架构3 常见消息模型3 1 基本消息队列 xff08 Basic Queue xff09 3 2 工作消息队列 xff08 Work Queue
  • Redis实战—黑马点评(一) 登录篇

    Redis实战 黑马点评 xff08 一 xff09 登录篇 来自黑马的redis课程的笔记 黑马程序员Redis入门到实战教程 xff0c 深度透析redis底层原理 43 redis分布式锁 43 企业解决方案 43 黑马点评实战项目
  • tigerVNC的简单使用教程(CentOS的远程桌面连接)

    tigerVNC的简单使用教程 xff08 CentOS的远程桌面连接 xff09 1 环境和软件准备 1 CentOS 6 3下 root 64 localhost rpm q tigervnc tigervnc server tiger
  • Redis实战—黑马点评(二)缓存篇

    Redis实战 黑马点评 xff08 二 xff09 缓存篇 目录 Redis实战 黑马点评 xff08 二 xff09 缓存篇1 什么是缓存1 1 缓存的作用和成本 2 添加 Redis 缓存3 缓存更新策略3 1 三种更新策略3 1 1
  • Reids实战—黑马点评(三)秒杀篇

    Reids实战 黑马点评 xff08 三 xff09 秒杀篇 来自黑马的redis课程的笔记 黑马程序员Redis入门到实战教程 xff0c 深度透析redis底层原理 43 redis分布式锁 43 企业解决方案 43 黑马点评实战项目
  • RT-Thread Stm32f103开启UART2(中断接收及轮询发送) 使用RT-Thread Studio

    RT Thread Stm32f103开启UART2 使用RT Thread Studio 1 使用RT Thread Studio新建RT Thread项目 2 修改dricer gt doard h 增加UART2的宏定义设置gpio接
  • 串口收发数据

    1 1 字符串接收函数 发送方结束标志是你接收方判断的依据 xff0c 也可以说是属于协议的一部分 我们这里使用串口助手数据发送自动添加了 r n xff0c 所以我们将它们看成结束标志 1 2 数据传输方式 计算机与外部进行沟通只有并行和
  • VsCode Studio的C/C++代码自动补全

    关于VsCode Studio的C C 43 43 代码自动补全 第一步 xff1a 需要下载VsCode中的C C 43 43 插件 如图 xff1a 插件下载后 xff0c 最好是重新启动一下VS 第二步 xff1a 找到设置 在输入框
  • Nginx lua设置Cookie,及学习Cookie

    网上看到这篇文章 xff0c 很喜欢这种分析思路 xff0c 这里学习记录一下 最近小了解了下cookie 以前觉得cookie无非就是一连串键值对 在深入了解之后发现 远没自己想的那么简单 自己果真太肤浅了 好吧 这里主要探讨一下以下几个