Express 安全地将承载令牌从仅服务器cookie传递到标头

Express 安全地将承载令牌从仅服务器cookie传递到标头,express,cookies,oauth,apollo,next.js,Express,Cookies,Oauth,Apollo,Next.js,是否有一种方法可以“安全”地将承载令牌存储在cookie中(运行Next.js应用程序的Express服务器的服务器端),然后将其作为标头的一部分提供,以便将其包含在每个Apollo请求中?Apollo团队有一个使用localStorage的示例,但是没有关于从cookie抓取它,而不是在标头中设置localStorage。为了缓解XSS,我正在研究这个问题。有没有一种方法可以安全地为此代码提供令牌而不在浏览器中公开令牌?这似乎已经在多个教程的部分中介绍过,但我似乎找不到任何基于此示例的最终代码

是否有一种方法可以“安全”地将承载令牌存储在cookie中(运行Next.js应用程序的Express服务器的服务器端),然后将其作为标头的一部分提供,以便将其包含在每个Apollo请求中?Apollo团队有一个使用localStorage的示例,但是没有关于从cookie抓取它,而不是在标头中设置localStorage。为了缓解XSS,我正在研究这个问题。有没有一种方法可以安全地为此代码提供令牌而不在浏览器中公开令牌?这似乎已经在多个教程的部分中介绍过,但我似乎找不到任何基于此示例的最终代码

import { ApolloClient } from 'apollo-client';
import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';

const httpLink = createHttpLink({
  uri: '/graphql',
});

const authLink = setContext((_, { headers }) => {
  // get the authentication token from local storage if it exists
  const token = localStorage.getItem('token');
  // return the headers to the context so httpLink can read them
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : "",
    }
  }
});

const client = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
});

我有一个Oauth2服务器,它希望从报头以授权的形式发送一个承载令牌:“承载****”。我只是在寻找最安全的方法来做这件事,我觉得我从大多数教程中得到了相互矛盾的信息。

将我的评论变成一个答案,因为它可以帮助你解决问题:


浏览器Javascript根本无法访问仅限服务器的cookie。因此,如果服务器将令牌放在仅限服务器的cookie中,那么您无法从浏览器Javascript访问该cookie。服务器可以使它成为一个普通的cookie,然后您可以通过浏览器Javascript访问它。或者,如果客户端实际上不在浏览器中,它可以获取cookie

是否有一种方法可以安全地为此代码提供令牌,而不必在浏览器中公开该令牌

如果此代码位于浏览器中(看起来像是因为它正在访问localStorage),则“否”,无法让此代码访问令牌,但不能让浏览器中的其他代码访问令牌。使用浏览器Javascript访问的任何内容都可以被世界访问。通常,您可以让服务器跟踪身份验证令牌,让服务器代表客户机访问特权服务器,并将结果发送给客户机,从而维护安全性

我要问的是。是否有一种方法可以通过node.js附加令牌cookie,以便在不通过客户端添加令牌cookie的情况下将其附加到所有Apollo请求


Apollo请求是直接从客户端发出还是仅从服务器发出?对不起,我不明白你的架构。如果仅从服务器创建,则可以在服务器上创建客户端会话(请参阅express session),并可以在该会话中存储属于特定客户端的内容,然后可以在将来的请求中检索这些内容。

浏览器Javascript根本无法访问仅服务器的cookie。因此,如果服务器将令牌放在仅限服务器的cookie中,那么您无法从浏览器Javascript访问该cookie。服务器可以使它成为一个普通的cookie,然后您可以通过浏览器Javascript访问它。或者,如果客户端实际上不在浏览器中,它可能会获取cookie。是否有一种方法可以安全地为此代码提供令牌而不在浏览器中公开令牌?。如果此代码位于浏览器中(看起来像是因为它正在访问
localStorage
),则“否”,无法让此代码访问令牌,但不能让浏览器中的其他代码访问令牌。使用浏览器Javascript访问的任何内容都可以被世界访问。通常,您可以让服务器跟踪身份验证令牌,让服务器代表客户端访问特权服务器,并将结果发送给客户端,从而维护安全性。感谢@jfriend00的评论。这是我的理解。一旦客户拥有它。它和公共知识一样好。基本上我要问的是。有没有一种方法可以让我的应用服务器附加一个带有此令牌的头,而不让它一直到客户端。因此,express(客户端-服务器)向需要身份验证的服务器发出请求。它传回一个令牌。express server than持有它并将其作为标头的一部分附加到所有通过它的流量。我不理解您评论的部分:“express server than持有它并将其作为标头的一部分附加到所有通过它的流量”?express服务器当然可以保留令牌(这可能是理想的设计),它可以使用该令牌代表特定客户机向其他服务器发出请求,只向客户机发送结果(而不是令牌)。我不知道你的评论中“通过它”的部分意味着什么。抱歉耽搁了。我要问的是。是否有一种方法可以通过node.js附加令牌cookie,以便在不通过客户端添加令牌cookie的情况下将其附加到所有Apollo请求。