处理 cookie 中 JWT 令牌以在客户端进行身份验证的正确方法

Correct way to handle JWT tokens in cookies for authentication on the client-side

我有一个后端在身份验证成功后以 JWT 令牌响应。但是,出于安全目的,cookie 不能从客户端可见。现在在前端我使用反应。我创建了一个设置和获取令牌的功能组件。我了解到存储 JWT 令牌的最佳方法是将其保存为 cookie 并从服务器端激活 HTTPOnly。我的问题是为了保护 JWT 令牌,如果激活了 HTTPOnly(这使得 cookie 不可见),我如何才能在前端正确保存 cookie?我打算使用 cookie 来检查用户是否已经登录。为了让您大致了解我在做什么,我在下面添加了组件。


export default function useToken() {
    const getToken = () => {
        const tokenString = localStorage.getItem("token"); // I will refactor localstorage to cookie
        const userToken = JSON.parse(tokenString as string);
        return userToken;
    }

    const [token, setToken] = useState<string>(getToken());

    const saveToken = (userToken: string) => {
        localStorage.setItem("token", JSON.stringify(userToken)); // I will refactor localstorage to cookie
        setToken(userToken)
    }
    return {
        setToken: saveToken, 
        token
    }
}


......

  const { token, setToken } = useToken()
  return (
    <div className="app">
      <Header />
      <Footer />

      <Router>
        <Routes>
          <Route path="/login" element={!token ? <Login setToken={setToken} /> : <Navigate to="/" />} />

.....

检查用户是否已经登录,一种常见的方法是:

只要来自后端的一个请求 returns HTTP 401,用户就被视为注销。

此外,这取决于您的前端是在 CDN 中还是在页面加载时访问服务器。在后一种情况下,你可以找到它 server-side.

然后,为了处理身份验证,您的服务器可以在收到请求时从 cookie 中读取 JWT 令牌。