Комментарии 15
Поддерживаю, тоже с подобным сталкивался. Поменяли бэк в одном сервисе, он перестал воспринимать куки, все посыпалось. Теперь взял за правило - куки делать максимально простыми. Пусть уж лучше их будет много простых чем одна сложная.
Не статья - золото!
Это не перевод, а какой-то позор. Автор не знает ни английского языка, ни русского, ни предметную область. Первое же предложение. Оригинал:
HTTP cookies are a small piece of data set by either Javascript or HTTP servers
Продукт мозговой деятельности @Sivchenko_translate:
HTTP-куки — это небольшие информационные добавки, направляемые на клиент с сервера, работающего с JavaScript или HTTP
(особенно доставляет это "или")
Перевод, если немного владеть русским языком и предметной областью:
Куки в HTTP - это небольшие кусочки информации, которое могут быть либо переданы с сервера, либо установлены Яваскриптом на клиенте
И так буквально везде. Автор перевода не понимает значение русского слова "переадресовывать". Не понимает и технологию, про которую пишет - у HTTP запросов нет области видимости, она есть у кук.
Дальше совсем смешно - "until it got passed along to some code that used the Go standard library" легким движением руки превращается в "передавать некоторый код, в котором использовалась стандартная библиотека Go". Ну действительно - какая разница, передавать код или передавать в код?
Самое печальное, что хабрааудитории это божья роса. "Статья агонь, афтар пешы ещо".
>Всё шло хорошо, пока не пришлось передавать некоторый код, в котором использовалась стандартная библиотека Go.
Тут чуть мозг не сломал
Ну и сама статья туда же. Она должна называться "Работать с куками - это всё равно что ходить по минному полю, если не знаешь даже самых базовых стандартов".
Если цель - передавать данные в куках, то в реальности всё прекрасно работает, достаточно всего лишь кодировать передаваемые данные по стандарту, с помощью банальной встроенной функции. Но если цель - насосать из пальца кликушескую статью, то конечно получится "кругом бардак, я одна тут стою вся в белом".
Справедливости ради, бардак кругом всё-таки оказался, просто все более-менее вменяемые вендоры тоже это заметили и не ставят в куках что-то непонятное. Максимум — токен какой-то из рафинированного ASCII. А то, с чем столкнулся автор — наверняка последствия самопального решения, автор которого не знал о таких граблях.
Джейсон в куки пишут все кому не лень. В частности в РНР это встречается сплошь и рядом. Поскольку тупо удобно и не требует вообще никаких телодвижений. И я не думаю, что некие вендоры должны себя ограничивать из-за какой-то крикливой особы, которая не зная основ НТТР написала неграмотный код, и он внезапно не заработал.
Тут только одно странно - почему она на куках остановилась. Ведь этот страшный баг и в GET запросах тоже присутствует. Посылаем запрос ?query=я купила m&ms детям в подарок
и начинаем кудахтать что аааа, всё сломалось, куда делись мои данные!
Так вы откройте любой крупный сайт и в инструментах разработчика вашего браузера посмотрите, какие куки он ставит. Найдёте там хоть одну с голым JSON'ом? Я вот ни разу не видел. Это и говорит о том, что крупные вендоры этого не делают. Так что они уже «себя ограничивают».
Возможно. У меня нет ни времени, ни желания просматривать куки всех вендоров. Но даже если и "не делают", то причины этого могут любыми. И не иметь ничего общего с изложенным в статье.
Впрочем, я посмотрел. И сразу увидел что ваше исходное утверждение,
Максимум — токен какой-то из рафинированного ASCII.
не имеет ничего общего с реальностью. Почти все пишут в куки сериализованные данные. Далеко ходить не надо - тот же Хабр. А почему они сериализованы не джейсоном - как раз понятно: когда сайт писался, джейсона еще и в проекте не было.
Но вообще суть моего комментария совсем не в этом. А в том, что если соблюдать стандарты (пусть это даже стандарт де-факто), то и статьи бы не было.
А если не соблюдать, то такие "баги" можно найти где угодно. Пример я привёл.
не имеет ничего общего с реальностью.
Видимо, у нас с вами разная реальность какая-то. Потому что как раз эти примеры и подтверждают мою точку зрения. Да, я слегка утрировал с рафинированностью, но вы и сами видели, что спецсимволов в куках очень мало стоит. Точки, проценты, знаки равенства, двоеточия. Кавычек не наблюдаю. Пробелов тоже.
Пример я привёл.
Простите, но тот ваш пример совершенно в левую степь. По строке запроса браузеры и сервера имеют общее представление, что там и как чего должно быть. В отличие от кук.
что если соблюдать стандарты
Как иронично, статья-то как раз о том, что соблюсти эти самые стандарты как раз-таки и невозможно ввиду их, стандартов, противоречивости друг другу. И возникших из-за этого последствий.
Последствия у неё только в голове. Чтобы драму на пустом месте развести. Стандарты есть и прекрасно работают - у тех, кому надо дело делать, а не статьи кропать.
А пример наш ровно в ту степь. Если от него не просто отмахиваться, а немножко над ним подумать, и соотнести с текущим кейсом.
Точки, проценты
Вот например, как раз отличный повод начать думать, задавшись вопросом, а что это за проценты? Может быть, они что-то такое означают, как и в моём примере? ;-)
Может быть, они что-то такое означают
Блин, я не пойму, вы поспорить ради спора что ли пришли? Я же ровно на это и намекаю вам всеми силами говорю прямым текстом, что никто голый JSON в куки не пихает. Если уж и пытаются, то как минимум, его сериализуют / кодируют. Потому что с голым проблемы начинаются. А вы мне говорите, что все по стандартам работают. Перечитайте статью ещё раз, как стандарты прекрасно работают, когда прямо в коде двух основных браузеров чёрным по белому написано, что они от стандартов отходят ради совместимости.
никто голый JSON в куки не пихает
Ну как это не пихает? Вот же - код, с которого вся статья и началась:
document.cookie = ` cookieNames=${favoriteCookies}` ;
Она сама и "пихает". А если бы "сериализовала или кодировала" то и статьи бы не было.
Так о том и речь, что бывалые уже наступили на эти грабли и так не делают. В отличие от неё — неофита. Потому что в конкретных условиях оно у неё как-то работало (хотя спецификации явно запрещают так работать, но так как и браузеры, и серверы относятся к спецификациям лояльно, но по-разному, то и получается, что где-то звёзды сходятся, а где-то — нет).
Но я понял свою ошибку. Поскольку РНР сам на лету и кодирует, и раскодирует, то я решил, что так делают все. Но сейчас понимаю, что это не так.
Работа с куки-файлами хуже сапёрного дела