Golang Set-Cookie with Fetch API

本文总结了有关浏览器Cookie的设置。前端使用Fetch API,后端使用Golang。

后端的配置

Golang代码如下

func handler(w http.ResponseWriter, r *http.Request) {
  // do something
	cookie := &http.Cookie{
		Name:     "key",
		Value:    "value",
		Path:     "/",
		HttpOnly: true,
		// Secure:   true,
	}

  http.SetCookie(w, cookie)
  // do something or return 
}

这里特别注意,如果是生产环境一定要开启Secure,即强制使用https,如果不是https,cookie将不会被浏览器设置,自然也不会被发回服务器,但Cookie还是会被发送到浏览器。

如果有nginx管理cors的话,后端不再需要管理,否则可能冲突。

前端的配置

前端的js代码,如果是使用Fetch API,则需要开启credentials: 'include',因为Fetch默认既不发送Cookie,也不接受Cookie,这里是接受,而不是接收,因为Cookie可以返回到客户端,但是Cookie没被设置。

fetch('http://localhost:4000/user/login', {
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        method: 'POST',
        body: JSON.stringify(data),
        mode: 'cors',
        cache: 'no-cache',
        redirect: 'follow',
        credentials: 'include'
      })
    .then(...)
    .catch(...)

Resources