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

下面是“一文彻底理清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日

相关文章

  • 一个极为简单的requirejs实现方法

    下面是关于“一个极为简单的requirejs实现方法”的具体攻略: 一、什么是RequireJS? RequireJS是一个用于JavaScript模块化开发的工具库,它可以帮助我们实现JavaScript代码的模块化编写,便于代码管理和维护,提高开发效率。 RequireJS的核心是一个AMD(Asynchronous Module Definition,…

    JavaScript 2023年6月11日
    00
  • js open() 与showModalDialog()方法使用介绍

    JS open() 与 showModalDialog() 方法使用介绍 在JavaScript中,通过 open() 与 showModalDialog() 方法可以打开新的浏览器窗口或对话框,提供更好的交互体验。 open() 方法介绍 open() 方法可以在新的浏览器窗口或选项卡中打开一个URL地址。具体语法如下: window.open(url, …

    JavaScript 2023年6月11日
    00
  • 完美解决IE9浏览器出现的对象未定义问题

    针对IE9浏览器出现的对象未定义问题,以下是完整攻略: 问题描述 在使用IE9浏览器访问某些网页时,可能会出现对象未定义的问题,原因是IE9对一些ES6的新特性支持不完善,导致无法正确解析JavaScript代码,特别是一些方法和属性在IE浏览器下不兼容,从而抛出对象未定义的错误。 解决方案 1. 使用Polyfill Polyfill是一种JavaScri…

    JavaScript 2023年6月11日
    00
  • 在html中引入外部js文件,并调用带参函数的方法

    下面是关于在HTML中引入外部JS文件并调用带参函数的完整攻略: 步骤一:准备JS文件和HTML文件 首先,我们需要准备一个包含带参函数的JS文件。例如,我们编写一个名为script.js的JS文件,其中包含以下代码: function greet(name) { console.log("Hello, " + name + "…

    JavaScript 2023年5月27日
    00
  • JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)

    下面我来详细讲解一下“JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)”的完整攻略。 1. 使用 navigator.userAgent 进行客户端检测 navigator.userAgent 属性返回了客户端浏览器提供的用户代理头部的字符串表示。我们可以基于这个字符串进行客户端检测。 这个字符串通常包含了以下信息: …

    JavaScript 2023年6月10日
    00
  • js中作用域的实例解析

    JS中作用域的实例解析 在JavaScript中,作用域(Scope)是指访问变量、函数等标识符的范围。JavaScript的作用域基于函数(Function)而非块级作用域(Block Scope),这意味着变量的作用域在代码块 {} 中没有意义,而是在它们所在的函数中定义的。本篇攻略将通过实例来详细讲解JS中作用域的概念。 一、全局作用域 全局作用域(G…

    JavaScript 2023年6月10日
    00
  • window.setInterval()方法的定义和用法及offsetLeft与style.left的区别

    一、window.setInterval()方法的定义和用法 window.setInterval()方法是JavaScript中的一个计时器函数,用于周期性地重复执行指定代码,间隔时间由用户自定义。它的语法如下: window.setInterval(func, delay, arg1, arg2, …) 参数说明: func:周期性执行的代码块,可以…

    JavaScript 2023年6月11日
    00
  • TypeScript与JavaScript的区别分析

    TypeScript与JavaScript的区别分析 介绍 TypeScript是微软推出的一种基于JavaScript语言的编程语言。它与JavaScript有很多共同点,但也有一些重要的不同之处。本文章将从以下几个方面介绍TypeScript与JavaScript的区别分析: 类型系统 静态检查 语言特性 编译过程 类型系统 TypeScript是一种强…

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