php/js cookie共享跨域的问题

记录一下最近做的一个cookie共享的需求.,有两种情况:

第一种:相同的顶级域名的情况下,只需要将cookie写在顶级域名下,该域名下的所有子域名都能访问到了。如 PHP:

//xxx.com   前面不能加.  (生成的cookie的domain是 .xxx.com)
setcookie('test','value',time()+60*60*24*30,'/','xxxx.com');

//xxx.com 的所有子域名就 都能获取到了
$_COOKIE['test'];

JS的设置和php类似:

//存储cookie,这里的域名必须是顶级域名
setCookie('test','value','xxx.com','20')
function setCookie(cName, value,domain,expireDate) {
	const exDate = new Date();
	exDate.setDate(exDate .getDate() + expireDate);
	document.cookie = cName + "=" + decodeURIComponent(value) + (expireDate== null ? "" : ";expires=" + exDate.toUTCString()) + ";path=/;domain="+domain;
}
 
//获取cookie
getCookie('test')
function getCookie(key) {
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[-.+*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

第二种:两个顶级域名不同的站点,需要在设置cookie的时候设置httpOnly、secure、sameSite;比如A设置了cookie,B可以通过jsonp的方式就能取到了。sameSite必须设置为None,默认是空。如PHP:

php>=7.3版本可以直接设置

setcookie('test','value',[
    'expires'=>time()+60*60*24*30,
    'path'=>'/',
    'domain'=>'xxx.com',
    'httponly'=>true,
    'secure'=>true,
    'samesite'=>'None'
]);

php<7.3

function samesite_setcookie($name, $value, array $options)
{
    $header = 'Set-Cookie:';
    $header .= rawurlencode($name) . '=' . rawurlencode($value) . ';';
    if (isset($options['expires'])) {
        $header .= 'expires=' . \gmdate('D, d-M-Y H:i:s T', $options['expires']) . ';';
    }
    if (isset($options['expires'])) {
        $header .= 'Max-Age=' . max(0, (int) ($options['expires'] - time())) . ';';
    }
    if (!empty($options['path'])) {
        $header .= 'path=' . $options['path']. ';';
    }
    if (!empty($options['domain'])) {
        $header .= 'domain=' . rawurlencode($options['domain']) . ';';
    }
    if (!empty($options['secure'])) {
        $header .= 'Secure;';
    }
    if (!empty($options['httponly'])) {
        $header .= 'HttpOnly;';
    }
    if (!empty($options['samesite'])) {
        $header .= 'SameSite=' . rawurlencode($options['samesite']);
    }
    header($header, false);
    $_COOKIE[$name] = $value;
}

samesite_setcookie('test', 'value', [
    'expires' => time()+60*60*24*30,
    'domain' => 'xxx.com',
    'httponly' => true,
    'samesite' => 'None',
    'secure' => true,
    'path' => '/'
]);

你可能感兴趣的:(php,php,javascript,cookie跨域)