#javascript #cookie #microsoft_edge
Есть домен example.com Есть поддомен subdomain.example.com Когда устанавливаю куки из JS, с явным указанием domain=example.com, они автоматически появляются на subdomain.example.com. Таким поведением обладает только MS Edge. Кто-нибудь знает, в чем тут дело?
Ответы
Ответ 1
Это просто особенность механизма сопоставления domain в разных браузерах. Edge, судя по всему, следует текущему Proposed Standard, RFC6265 от 2011 года. В нем правила проверки доменов следующие: 5.1.3. Domain Matching A string domain-matches a given domain string if at least one of the following conditions hold: o The domain string and the string are identical. (Note that both the domain string and the string will have been canonicalized to lower case at this point.) o All of the following conditions hold: * The domain string is a suffix of the string. * The last character of the string that is not included in the domain string is a %x2E (".") character. * The string is a host name (i.e., not an IP address). Т.е. кука, поставленная с явным указанием домена, всегда доступна в субдомене. И это нормально. Куки, для которых домен не был указан, устанавливаются с host-only-flag, который ограничивает их доступность только текущим доменом (без сабдоменов). Не столь современные браузеры, пытаются следовать устаревшему RFC2965 от 2000-го года, в котором проверка выглядела немного хитрее: Host A's name domain-matches host B's if * their host name strings string-compare equal; or * A is a HDN string and has the form NB, where N is a non-empty name string, B has the form .B', and B' is a HDN string. (So, x.y.com domain-matches .Y.com but not Y.com.) Т.е. сабдомены видели куки от основного домена только в том случае, если значение domain у куки начиналось с точки. Хитрость заключалась в том, что браузер был обязан дописать точку в значение domain. If an explicitly specified value does not start with a dot, the user agent supplies a leading dot. но только в случае, если домен выставлялся через заголовок Set-Cookie. Если домен не был явно задан - то кука ставилась на домен без . в начале, и была недоступна для сабдоменов. Что приносило веселейшие баги в Chrome, когда кука на клиенте была поставлена одновременно с точкой и без точки, и удалить ее с сервера было невозможно. Случай же установки куки через document.cookie стандарт не покрывал. Какие-то браузеры (IE/Edge) дописывают точку автоматом. Какие-то - ожидают, что вы допишите ее перед domain вручную. В любом случае, RFC2965 устарел, так что рано или позно все куки станут видны сабдоменам. В соседнем ответе есть ссылка на developer.mozilla.org, и даже там уже сказано Contrary to earlier specifications, leading dots in domain names are ignored. If a domain is specified, subdomains are always included.Ответ 2
Если вы задаёте куку с указанием домена: document.cookie = "test=1; path=/; domain=example.com"; То, по-умолчанию, на поддоменах включая subdomain.example.com эта кука тоже будет видна. Если вам нужно чтобы кука была видна только на текущем домене, то, согласно документации, вам вообще не нужно указывать какой-либо домен. Например, так: document.cookie = "test=1; path=/";
Комментариев нет:
Отправить комментарий