JSON Web Token
Методов авторизации и аутентификации есть много, но в последнее время большинство из них основывается на JWT.
JSON Web Token — это созданная в определенном формате base64 строка. JWT считается одним из самых безопасных и удобных форматов для передачи токенов и небольшого набора пользовательских данных с запросом.
Особенность такого формата токена в первую очередь заключается в удобстве. JWT — полностью самодостаточная единица информации. Все необходимые для идентификации данные можно хранить в самом токене, в блоке с полезной нагрузкой.
Каждый токен доступа состоит из трёх основных частей:
— Заголовок, в котором определяется информация о самом токене
— Полезная нагрузка — JSON объект, куда записываются все данные, необходимые для авторизации
— Подпись — ключ, который, пусть и не позволит зашифровать сам токен, зато дает возможность валидировать токен на изменения.
Части токена разделяются точками.
Вот так это может выглядеть.
В этом токене в качестве полезной нагрузки использовался такой объект:
Причём, обратите внимание на то, что чувствительную информацию в токене хранить всё равно нельзя. Не забывайте, что JWT — это всего лишь
Да и вообще, чем меньше данных о пользователе, тем лучше.
И на этом, в целом, всё. Спасибо за прочтение, это важно для меня ❤️
#data #theory #useful
Методов авторизации и аутентификации есть много, но в последнее время большинство из них основывается на JWT.
JSON Web Token — это созданная в определенном формате base64 строка. JWT считается одним из самых безопасных и удобных форматов для передачи токенов и небольшого набора пользовательских данных с запросом.
Особенность такого формата токена в первую очередь заключается в удобстве. JWT — полностью самодостаточная единица информации. Все необходимые для идентификации данные можно хранить в самом токене, в блоке с полезной нагрузкой.
Каждый токен доступа состоит из трёх основных частей:
— Заголовок, в котором определяется информация о самом токене
— Полезная нагрузка — JSON объект, куда записываются все данные, необходимые для авторизации
— Подпись — ключ, который, пусть и не позволит зашифровать сам токен, зато дает возможность валидировать токен на изменения.
Части токена разделяются точками.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcm9nd2F5IiwiaWF0IjoxNjg4MDMzMzI1LCJleHAiOjE3MTk1NjkzMjUsImF1ZCI6Ind3dy5wcm9nd2F5LmNvbSIsInN1YiI6InByb2d3YXkiLCJuYW1lIjoiRGVuaXMiLCJzdXJuYW1lIjoiUHV0bm92IiwiZW1haWwiOiJwcm9nd2F5QGVtYWlsLmNvbSIsInJvbGUiOiJBRE1JTiJ9.BTdcnNwZBfAHEmZEwf2P7s724Q1sZ60N2dHVRXhGtHI
Вот так это может выглядеть.
В этом токене в качестве полезной нагрузки использовался такой объект:
{
"name": "Denis",
"surname": "Putnov",
"email": "progway@email.com",
"role": "ADMIN"
}
Причём, обратите внимание на то, что чувствительную информацию в токене хранить всё равно нельзя. Не забывайте, что JWT — это всего лишь
base64
, поэтому декодировать его сможет любой желающий. Да и вообще, чем меньше данных о пользователе, тем лучше.
И на этом, в целом, всё. Спасибо за прочтение, это важно для меня ❤️
#data #theory #useful
👍28❤9🔥3🐳2🍌2☃1🥰1
Ссылочные типы и типы значений в JavaScript
Перед прочтением я рекомендую пробежаться по ещё одному посту из канала о том, какие типы данных есть в JavaScript.
В языке JavaScript, типы данных можно разделить на две большие группы:
Типы значений — примитивы — данные, что языком воспринимаются по конкретному значению. Например, строка
Ссылочные типы — типы данных, которые интерпретатор языка воспринимает по ссылке. Переменная больше не хранит в себе конкретное значение, зато сохраняет ссылку на место в памяти, где это самое значение хранится.
К ссылочным типам данных относятся:
— объекты
— массивы
— функции
Казалось бы, а какая разница? Но разница заключается в способе хранения и передачи этих самых данных через переменные, а так же в способе взаимодействия с ними.
Типы значений потому и называются примитивами, так как максимально просты и предсказуемы в этом плане. Такие переменные, по сути, представляют собой просто некоторую последовательность байт. При сравнении таких переменных, всё, что нужно сделать языку — посимвольно сравнить цепочки байт и выдать результат.
Ссылочные же типы, в свою очередь, могут вызвать много проблем при работе с ними. Переменная сохраняет под собой не конкретную последовательность байт, а, как и говорилось выше, лишь некоторую ссылку на ячейку памяти, в которой нужная для нас информация (байты) и записаны. Из ключевых особенностей таких типов данных сразу же приходит на ум их копирование, с чем часто возникают проблемы у новичков и не только.
Например, в этом случае мы получаем не ожидаемый для многих вывод в консоль:
Связано это со спецификой работы
Более подробно о понятии глубокого копирования я расскажу в отдельном посте. Он будет одним из следующих.
#javascript #data #theory #useful
Перед прочтением я рекомендую пробежаться по ещё одному посту из канала о том, какие типы данных есть в JavaScript.
В языке JavaScript, типы данных можно разделить на две большие группы:
Типы значений — примитивы — данные, что языком воспринимаются по конкретному значению. Например, строка
"Hello, World!"
или число 5
.Ссылочные типы — типы данных, которые интерпретатор языка воспринимает по ссылке. Переменная больше не хранит в себе конкретное значение, зато сохраняет ссылку на место в памяти, где это самое значение хранится.
К ссылочным типам данных относятся:
— объекты
— массивы
— функции
Казалось бы, а какая разница? Но разница заключается в способе хранения и передачи этих самых данных через переменные, а так же в способе взаимодействия с ними.
Типы значений потому и называются примитивами, так как максимально просты и предсказуемы в этом плане. Такие переменные, по сути, представляют собой просто некоторую последовательность байт. При сравнении таких переменных, всё, что нужно сделать языку — посимвольно сравнить цепочки байт и выдать результат.
Ссылочные же типы, в свою очередь, могут вызвать много проблем при работе с ними. Переменная сохраняет под собой не конкретную последовательность байт, а, как и говорилось выше, лишь некоторую ссылку на ячейку памяти, в которой нужная для нас информация (байты) и записаны. Из ключевых особенностей таких типов данных сразу же приходит на ум их копирование, с чем часто возникают проблемы у новичков и не только.
Например, в этом случае мы получаем не ожидаемый для многих вывод в консоль:
const obj = {
name: "Denis",
address: {
street: 'Lenina',
apartment: 10
}
}
const clone = Object.assign({}, obj)
obj.address.street = 'Pushkina'
console.log(clone.address.street) // Pushkina
Связано это со спецификой работы
Object.assign
и особенностями копирования вложенных объектов. В этом случае копирование считается неглубоким, поэтому скопированный объект также изменяется.Более подробно о понятии глубокого копирования я расскажу в отдельном посте. Он будет одним из следующих.
#javascript #data #theory #useful
🔥20👍11❤4🐳2
Понятие глубокого копирования
В JavaScript’e, да и в других языках, часто встречаются ссылочные типы данных, вокруг которых строится одновременно много самых различных полезных хаков и не очень полезных проблем.
Понятие глубокого копирования, на самом-то деле, достаточно простое. Рассмотрим код:
В данном случае мы получим не ожидаемый для многих вывод в консоль. Связано это с тем, что
На данный момент в памяти у нас есть три объекта:
И, на самом деле,
Для решения этой проблемы можно воспользоваться рекурсивными алгоритмами на основе того же
Тут вывод уже будет ожидаемым, поскольку мы вручную пересоздали ссылку на объект в поле
Подобные проблемы и решения также можно увидеть и в контексте массивов.
#javascript #theory #data
В JavaScript’e, да и в других языках, часто встречаются ссылочные типы данных, вокруг которых строится одновременно много самых различных полезных хаков и не очень полезных проблем.
Понятие глубокого копирования, на самом-то деле, достаточно простое. Рассмотрим код:
const obj = {
name: "Denis",
address: {
street: 'Lenina',
apartment: 10
}
}
const clone = Object.assign({}, obj)
obj.address.street = 'Pushkina'
console.log(clone.address.street) // Pushkina
В данном случае мы получим не ожидаемый для многих вывод в консоль. Связано это с тем, что
Object.assign
не осуществляет глубокое копирование.На данный момент в памяти у нас есть три объекта:
— obj
— clone
— obj.address
И, на самом деле,
obj.address === clone.address
. Этот вложенный объект для obj
и clone
на самом деле — один и тот же объект в памяти, поскольку Object.assign
полностью скопировал только примитивы, а поле address
просто перенёс по ссылке. Для решения этой проблемы можно воспользоваться рекурсивными алгоритмами на основе того же
Object.assign
для глубокого копирования объекта. Или же, если мы точно знаем какие поля будут в нашем объекте, можем воспользоваться следующим синтаксисом через spread
оператор:const obj = {
name: "Denis",
address: {
street: "Lenina",
apartment: 10
}
};
const clone = {
...obj,
address: {
...obj.address
}
};
obj.address.street = "Pushkina";
console.log(clone.address.street); // Lenina
Тут вывод уже будет ожидаемым, поскольку мы вручную пересоздали ссылку на объект в поле
address
и заполнили его значениями из исходного объекта. Однако стоит быть осторожным при копировании объектов таким способом и помнить, что spread
оператор не копирует геттеры и сеттеры, как и Object.assign
.Подобные проблемы и решения также можно увидеть и в контексте массивов.
#javascript #theory #data
🔥20👍11❤3🤯3🐳2🤔1