Характеристики на бисквитката (cookie)
Освен основната текстова информация "име=стойност", която HTTP бисквитките съдържат, сайтът, който ги създава, може да прикрепи към тях и характеристики, чрез задаване на атрибути. Атрибутите на бисквитката служат на браузъра за обработката й, за колко време да я складира, как да я изпрати обратно, за кой сайт е предназначена и други. Атрибутите се използват само за обработката на бисквитката от самия браузър, те не се изпращат обратно към сайта.
Атрибути на HTTP бисквитките
Атрибутите на бисквитката се изреждат един след друг, непосредствено след основната информация (име=стойност). Например:
Set-Cookie: language=bg-BG; Max-Age=3600; Expires=Sun, 09 Nov 2017 08:49:37 GMT; Path=/blog
Set-Cookie е HTTP хедър, намиращ се в HTTP отговора от сайта;
language=bg-BG - основната информация на бисквитката, име и стойност;
Max-Age, Expires и Path са атрибутите на бисквитката;
Бисквитката, заедно с атрибутите й, се записва от уеб браузъра в системното му пространство. А ако към нея липсват някои основни и "задължителни" атрибути като Domain, Path и други, браузърът сам ще си ги създаде и попълни. Според зададения период, браузърът ще пази бисквитката до изтичане на броя секунди (в Max-Age) или до посочената дата (в Expires). Бисквитката ще бъде изпратена към сайта, само ако търсеният от посетителя ресурс се намира на адреса /blog (посочен в Path), например mysupersite.com/blog.
Expires
Expires указва до кога бисквитката е валидна, чрез посочена точна дата и час. След тази дата и час, браузърът може да премахне бисквитката. Възможно е бисквитката да бъде премахната, преди изтичането на валидността й, ръчно от потребителя.
Max-Age
Този атрибут указва максималния период на валидност на бисквитката, чрез посочен брой секунди. След изтичане на тези секунди, браузърът може да премахне бисквитката.
Когато и двата атрибута (Expires и Max-Age) липсват, тогава браузърът пази бисквитката до прекратяване на сесията (до затваряне на браузъра). В този случай браузърът ще обозначи бисквитката като временна (сесийна) и ще я премахне след края на сесията.
Domain
Когато към бисквитката не е зададен атрибута Domain, повечето браузъри ще я тълкуват като HostOnly (host-only-flag=true) бисквитка. Това означава, че ще я връщат единствено към домейна (без поддомейните), от който реално е получена. В този случай уеб браузърите задават служебно атрибута Domain, като поставят в него стойността на полето Host, взето от HTTP заявката към същия този сайт. Например браузърът прави заявка към mysupersite.com, сайтът подава бисквитка без Domain, браузърът взима от своята заявка съдържанието на Host полето и записва бисквитката с Domain=mysupersite.com. Браузърът няма да изпрати HostOnly бисквитки към домейни от по-горно ниво или поддомейни, но само и единствено към зададения служебно домейн.
Начинът, по който дадена бисквитка ще се обработи, може да се различава при различните уеб браузъри. Поради това в IE 11 например, въпреки че дадена бисквитка е предназначена да е HostOnly, този браузър ще я изпраща и към поддомейните на домейна. Тоест бисквитка със зададен служебно атрибут Domain=mysupersite.com ще бъде изпращана и към blog.mysupersite.com, www.mysupersite.com и всички други съществуващи поддомейни.
Когато бисквитката идва с атрибута Domain, тогава тя ще се тълкува като notHostOnly (host-only-flag=false) и някои браузъри ще означат това, като поставят точка "." пред домейна, например .mysupersite.com. Тази бисквитка ще се подава и към всички поддомейни на домейна.
Path
Бисквитките се асоциират и са валидни за даден сайт, не за определена страница от него. Покритието на бисквитката може да се ограничи до определен път (под-уеб адрес), изписан след домейна. Например ако имате няколко сайта в различни поддиректории като mysupersite.com/blog, mysupersite.com/shop и други, чрез атрибута Path може да се зададе бисквитката да е валидна само за конкретния /адрес. В такива случаи атрибутът Path за отделните сайтове би изглеждал така:
Set-Cookie: language=bg-BG; Path=/blog
Set-Cookie: language=bg-BG; Path=/shop
Бисквитката ще е валидна само за посочения адрес в Path. Например ако е зададен път Path=/wp-admin, тогава браузърът ще прати бисквитката единствено при достъпване на адреса mysupersite.com/wp-admin.
Ако атрибутът Path не е зададен в бисквитката, браузърът го попълва системно със стойността от "линията на заявката", като от нея взима само пътя до директорията (ако директория няма, тогава задава /). Например ако в заявката се търси ресурс: "GET /shop HTTP/1.1", системно зададеният атрибут ще изглежда така Path=/shop).
Secure
Secure атрибутът показва на браузъра, че бисквитката е специална и е предназначена за предаване единствено и само по защитена връзка (HTTPS).
HttpOnly
HttpOnly атрибутът казва на уеб браузъра, че бисквитката е предназначена за изпращане единствено чрез HTTP заявка. Този атрибут ограничава вътрешния достъп до бисквитката. Тоест браузърът трябва да "скрие" бисквитката от достъп за други приложения и технологии, които работят към/в него като например JavaScript.
Как сайтът изпраща бисквитката и атрибутите й към посетителя?
Бисквитката може да бъде "изпратена" по HTTP в HTTP хедъра Set-Cookie или зададена директно в браузъра чрез JavaScript код.
Чрез HTTP хедъра Set-Cookie
Сайтът може да изпрати бисквитката към браузъра в HTTP хедъра Set-Cookie. Бисквитката, тоест информацията "име=стойност" + атрибутите й, реално се намира в HTTP отговора на сайта, в HTTP хедъра Set-Cookie. Заедно с всички останали HTTP хедъри в HTTP отговора от сайта, бисквитката пристига при браузъра по създадената TCP/IP връзка.
Сайтът може да изпрати на посетителя си повече от една бисквитка, като за всяка използва нов ред с хедъра Set-Cookie.
Например сайтът изпраща към посетителя двете бисквитки:
Set-Cookie: language=bg-BG; Max-Age=3600; Expires=Sun, 09 Nov 2017 08:49:37 GMT; Path=/
Set-Cookie: UserID=jfd34ads; Path=/; Secure; HttpOnly
language=bg-BG - информацията на бисквитката (име=стойност); Max-Age, Expires и Path=/ са атрибути;
UserID=jfd34ads - информацията на бисквитката (име=стойност); Path=/, Secure и HttpOnly са атрибути;
Бисквитката language=bg-BG е постоянна, а другата UserID=jfd34ads се нарича временна (или сесийна), защото няма зададен период на валидност и ще бъде изтрита при изтичане на сесията.
След като браузърът запише тези бисквитки, при всяка следваща заявка към същия сайт, той ще ги върне към сайта чрез HTTP хедъра Cookie. В един Cookie хедър браузърът може да постави повече от една бисквитка:
Cookie: language=bg-BG; UserID=jfd34ads
Чрез JavaScript код
Друг начин за създаване и четене на бисквитки е чрез JavaScript код. Когато потребителят зарежда страницата, заедно с нея се сваля и .js скрипт. JavaScript кодът се изпълнява от/в самия уеб браузър. Чрез JavaScript код може директно да се създават, прочитат и изтриват бисквитки в браузъра.
примерна бисквитка, зададена чрез JavaScript:
document.cookie = 'language=bg-BG; Max-Age=3600; Path=/blog'
document.cookie е DOM елемент, намиращ се в заредената вече страница;
language=bg-BG - информацията на бисквитката, име и стойност;
Max-Age и Path са атрибутите на бисквитката;
Примерни бисквитки, задавани чрез JavaScript, са тези на Google Анализ (Analytics) (_ga, _gid, _gat).
Докато дадена страница от сайта се зарежда, на заден план се изтегля .js скрипт на Google Analytics - analytics.js. Този скрипт реално се сваля от външен сървър (google-analytics.com), различен от този, на който се намира сайта. При изпълнението му в браузъра се създават бисквитките _ga, _gat, _gid. Тези бисквитки не пристигат по HTTP.
Атрибутът Domain на тези бисквитки е зададен с домейна на сайта, чрез който е извикан и на който се изпълнява скрипта analytics.js. Малко по-технически погледнато, в скрипта е зададено домейнът, за атрибута Domain, да се взима автоматично от стойността на document.location.hostname в дървото на документа (DOM) на текущо заредената страница. Също така тези бисквитки се задават за основния домейн, независимо дали сайтът реално се намира на поддомейн.
Актуалният скрипт на Google Анализ вече е analytics.js, вместо до сега ползвания ga.js. В случай че ползвате Google Анализ за вашия сайт, препоръчително е да направите ъпгрейд на проследяващия код. От предишния скрипт за събиране на статистики на Google Анализ - ga.js, се задаваха бисквитките __utma, __utmt, __utmb, __utmc и __utmz.