一文彻底理清session、cookie、token的区别

yizhihongxing

下面是“一文彻底理清session、cookie、token的区别”完整攻略。

概述

在Web开发中,我们经常要处理用户的身份认证和数据交互,而session、cookie、token是其中三个重要的概念。这三者都是用来保持用户登录状态或者传递一些特定信息的机制,但是它们之间的区别有很多,下面我们就来一一讲解。

Session

Session是一种在服务器端存储用户信息的技术,它可以用来跟踪用户的状态,实现登录状态的保持。在用户进行登录操作后,服务器会创建一个Session ID,并把该ID存储在Cookie中,将Session ID和用户信息存储在服务器端。当用户访问其他页面时,会把Session ID通过Cookie传递给服务器,服务器就可以根据该ID来获取用户信息以及实现权限控制等操作。

下面是用Express框架实现Session功能的示例代码:

const express = require('express')
const session = require('express-session')

const app = express()

app.use(session({
  secret: 'mysecretkey',
  resave: false,
  saveUninitialized: false
}))

app.get('/', (req, res) => {
  // 通过req.session来访问session信息
  if (req.session && req.session.user) {
    res.send(`Hello, ${req.session.user}`)
  } else {
    res.send('You need to login first')
  }
})

app.post('/login', (req, res) => {
  // 登录验证通过后,将用户信息存储在session中
  req.session.user = 'Alice'
  res.send('Login success')
})

app.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们使用了express-session模块来实现Session功能。使用req.session可以访问到该用户的Session信息,如果没有就返回空。当用户成功登录时,我们就将用户信息存储在Session中,这样当用户访问其他页面时,就可以根据Session来判断用户是否登录。

Cookie

Cookie是一种存储在客户端的小型文本文件,它可以用来实现跟踪状态、记录历史等功能。当客户端请求一个网站时,服务器可以发送一个包含Cookie的响应头,客户端就会把该Cookie存储下来。以后每次客户端发送请求时,都会把存储的Cookie发送给服务器。通过Cookie,服务器可以识别客户端,跟踪其操作状态,也可以根据其历史记录进行一些个性化的推荐。

下面是用Node.js原生API实现Cookie功能的示例代码:

const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => {
  // 解析Cookie
  const cookies = parseCookies(req.headers.cookie)

  if (req.url === '/login' && req.method === 'POST') {
    // 登录验证通过后,设置Cookie
    res.writeHead(302, {
      'Set-Cookie': 'user=Alice; httpOnly'
    })
    res.end()
  } else if (req.url === '/') {
    if (cookies.user) {
      res.writeHead(200, {'Content-Type': 'text/html'})
      res.end(`Hello, ${cookies.user}`)
    } else {
      fs.readFile('index.html', (err, data) => {
        if (err) {
          res.writeHead(500)
          res.end('Internal Server Error')
        } else {
          res.writeHead(200, {'Content-Type': 'text/html'})
          res.end(data)
        }
      })
    }
  } else {
    res.writeHead(404)
    res.end('Not Found')
  }

  function parseCookies(cookie) {
    return cookie ? cookie.split(';').reduce((acc, curr) => {
      const [name, value] = curr.split('=').map(c => c.trim())
      acc[name] = value
      return acc
    }, {}) : {}
  }
})

server.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们自己实现了一个简单的Cookie功能,并使用了httpOnly属性来增强Cookie的安全性。当用户成功登录后,我们设置了一个名为user的Cookie,并且只能通过http请求访问。当用户再次访问网站时,我们通过解析请求头中的Cookie来获取user信息,从而实现了用户信息的存储和传递。

Token

Token是一种在Web开发中常用的身份认证机制,它是服务器颁发给客户端的一个令牌,用来保证用户的身份认证和数据传输的安全性。当用户进行登录操作后,服务器会生成一个Token,并将其返回给客户端,客户端以后每次发送请求时,都需要带上该Token,服务器就可以根据Token来判断用户的身份。

下面是用JWT库实现Token机制的示例代码:

const express = require('express')
const jwt = require('jsonwebtoken')
const bodyParser = require('body-parser')

const app = express()

app.use(bodyParser.urlencoded({ extended: false }))

// 登录验证通过后,生成Token
app.post('/login', (req, res) => {
  const { name } = req.body
  const token = jwt.sign({ name }, 'myjwtsecret', { expiresIn: '1h' })
  res.json({ token })
})

// 需要身份认证的接口,验证Token
app.get('/api/secure', (req, res) => {
  const authHeader = req.headers.authorization
  if (authHeader) {
    const token = authHeader.split(' ')[1]
    jwt.verify(token, 'myjwtsecret', (err, decoded) => {
      if (err) {
        res.sendStatus(403)
      } else {
        res.json({ message: `Hello, ${decoded.name}` })
      }
    })
  } else {
    res.sendStatus(401)
  }
})

app.listen(3000, () => console.log('Server running on port 3000'))

在这个代码中,我们使用了jsonwebtoken库来生成Token和验证Token。当用户进行登录操作时,我们通过签发Token的方式生成一个Token,并将其返回给客户端。当需要进行身份认证的接口被请求时,我们从请求头中获取Token,并使用jsonwebtoken库的verify函数来验证Token的有效性和准确性,从而实现了身份认证的功能。

总结

Session、Cookie、Token都是常见的Web技术,它们在身份认证和数据传递中都有着重要的作用。需要注意的是,在使用Session和Cookie的时候,我们需要注意安全性,防止信息泄露或者被篡改;在使用Token的时候,我们需要注意Token的有效期和安全性,防止Token被截获或者被泄露。以上便是“一文彻底理清session、cookie、token的区别”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文彻底理清session、cookie、token的区别 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 深入理解JavaScript事件机制

    深入理解JavaScript事件机制 JavaScript的事件机制为我们在网页中开发交互体验提供了强大的支持。要深入理解JavaScript事件机制包括以下三个方面: 事件类型 事件模型 事件处理函数 事件类型 JavaScript中定义了很多事件类型,例如鼠标相关的事件类型包括: click 鼠标单击事件 dblclick 鼠标双击事件 mousedow…

    JavaScript 2023年6月11日
    00
  • 两个JavaScript jsFiddle JSBin在线调试器

    两个在线调试器jsFiddle和JS Bin都是非常受欢迎的前端开发工具,它们可以帮助开发者更快地验证JavaScript代码,并与其他开发者共享代码示例。接下来,我将详细讲解这两个工具的使用方法,包括如何创建代码示例、调试代码以及与其他用户共享示例。 JSFiddle 什么是JSFiddle? JSFiddle是一个在线代码编辑器和调试器,可以在其中编写并…

    JavaScript 2023年5月28日
    00
  • jquery实现浮动在网页右下角的彩票开奖公告窗口代码

    下面我将详细讲解“jquery实现浮动在网页右下角的彩票开奖公告窗口代码”的攻略。 基本思路 我们的目标是实现一个浮动在网页右下角的彩票开奖公告窗口。具体实现思路如下: 在页面底部右下角添加一个固定宽度和高度的 div 元素,设置其 position 属性为 fixed,bottom 和 right 属性为 0,这样就可以让该元素始终浮动在页面的右下角。 在…

    JavaScript 2023年6月11日
    00
  • js分页显示div的内容

    下面是我的分页显示div内容的攻略: 什么是分页显示div的内容 分页显示div的内容是指在一个较大的div中,将内容进行分页,并且通过一些交互方式,可以实现翻页、跳页等操作,从而更好地展示数据。 分页显示div的实现 分页显示div的实现可以通过JavaScript代码来实现,其中包含以下几个步骤: 计算分页 首先需要计算数据的分页情况,这可以通过获取数据…

    JavaScript 2023年5月28日
    00
  • Marked.js让您的文档编辑更加轻松自如

    ​ 低代码应用平台——kintone既可以保留更改记录,也有流程管理的功能,在公司内部分享会议记录啊、wiki等文档或学习资料等时非常的便利。 kintone还有丰富的文本编辑框,可以对内容进行编辑提高易读性。但是还是有不少人觉得如果能够使用Markdown编辑,将更加轻松,文本也将更加美观。※特别受程序员的欢迎:) 这次就向大家介绍如何使用Cybozu C…

    JavaScript 2023年5月8日
    00
  • uniapp实现横屏签字版

    实现横屏签字版可以利用uniapp中的canvas以及第三方的canvas插件实现。 步骤一:安装canvas插件 在uniapp中使用canvas需要下载并安装canvas插件,下载地址为:https://ext.dcloud.net.cn/plugin?id=127 下载完成后,在uniapp项目的根目录下,打开cmd或者终端并输入如下命令: npm i…

    JavaScript 2023年6月11日
    00
  • javascript动态获取登录时间和在线时长

    1. 获取登录时间 在Javascript中获取登录时间需要使用Date对象。可以在用户登录时记录服务器端的时间戳,然后将时间戳传递给前端,使用Date对象将时间戳转换成具体的日期时间,最后将日期时间显示在页面上。 例如,假设用户登录时服务器端返回的时间戳为 1574825471373,那么我们可以使用以下代码将时间戳转换成日期时间: const login…

    JavaScript 2023年5月27日
    00
  • javascript转换日期字符串为Date日期对象的方法

    当我们从后端服务器获得日期和时间时,通常以字符串形式接收到,如”2022-03-17 15:58:38″。如果想在前端实现对日期和时间的处理,可以使用JavaScript中的Date对象,因此我们需要将日期字符串格式转换成Date对象。下面是转换日期字符串为Date日期对象的方法: 方法一:使用new Date()构造函数 可以使用JavaScript中的D…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部