HTTP Flashcards

1
Q

Что такое HTTP?

A

HTTP – протокол прикладного уровня. Он предназначен для общения между двумя программами (клиентом и сервером), находящимися на разных компьютерах. Но, сам по себе, HTTP не может соединять два удаленных компьютера. Для этого используются другие протоколы, среди которых TCP. Именно TCP позволяет соединить программы на удаленных компьютерах, создав канал для общения друг с другом. Для этого нужно знать два параметра: ip-адрес компьютера, к которому нужно подключиться, и порт, на котором “висит” нужная программа

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Дефолтные порты HTTP/HTTPS

A

HTTP: 80
HTTPS: 443

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Что из себя представляет сам запрос?

A

HEAD / HTTP/1.0
User-Agent: google chrome
Запрос состоит из нескольких частей. Первая часть — стартовая строка (request line). Вторая — заголовки.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что из себя представляет стартовая строка?

A

В стартовой строке мы указываем специальное слово, еще говорят “глагол”. В данном случае мы будем использовать глагол HEAD. Он очень простой, и просит сервер отдать только заголовки, без содержимого. Более распространенным является GET. Именно с помощью GET мы запрашиваем содержимое сайта.

После глагола указывается путь к ресурсу request URI. Если мы указываем /, это обозначает просто корень сайта.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что из себя представляет заголовок?

A

Заголовки позволяют передавать дополнительную информацию, например браузеры предоставляют информацию о себе, чтобы было понятно откуда идет запрос. Кроме этого они указывают какие форматы сжатия поддерживают, в каком формате готовы принимать ответ и так далее. Количество стандартных заголовков достаточно большое, помимо них можно добавлять любые свои.

Давайте рассмотрим, как выглядят заголовки. Мы указываем имя и через двоеточие какое-то значение: REFERER: value. Заголовки часто указывают заглавными буквами, но регистр здесь не важен. Порядок заголовков также не специфицирован. В каком бы порядке мы ни передали заголовки, тело ответа будет разбираться только все вместе.

Браузерами используется много заголовков, например, user-agent. Этот заголовок используется для аналитики, а также, когда необходимо адаптировать страницы сайта под разные экраны или браузеры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Правила протокола

A

Важно помнить, поскольку это протокол, и у него есть определенные правила, то нарушать их нельзя. HTTP — текстовый протокол. Все правила основаны на простых соглашениях. Например, несколько заголовков отделяются друг от друга переводом строки (и никак иначе!). Мы не можем записать их в одну строку, через запятую или как-то еще. Все очень строго.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

каким образом сервер поймет, что вы закончили передавать данные?

A

Это должен быть какой-то маркер, определитель. В HTTP это делается с помощью двух переводов строки. После этого сервер считает что все данные были отправлены и больше данных не будет. То есть фактически два перевода строки (перевод после последнего заголовка и пустая строка) приводят к отправке данных

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что из себя представляет ответ?

A
HTTP/1.0 200 OK
Date: Sat, 18 Jan 2020 09:24:50 GMT
Expires: -1

status line: Версия протокола, код ответа, сообщение.
Заголовки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Закрытие соединения хостом.

A

В конце мы видим одну интересную деталь: Connection closed by foreign host. Запрос соединения был закрыт внешним хостом. Так работает практически все в интернете. Обычно серверы настроены на 30-секундный интервал и закрывают соединение, если в течение этого интервала ничего не приходит.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что (обычно) означает сообщение “Connection closed by foreign host”, отправленное веб-сервером?

A

превышен интервал ожидания, соединение закрыто

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

HTTP-запрос невозможен без

A

стартовой строки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Как при HTTP-запросе обозначается конец запроса?

A

два перевода строки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как выполнить запрос?

A

telnet localhost 8080
GET /about HTTP/1.0

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Протокол HTTP 1.1 расширяет возможности предыдущей версии и добавляет виртуальные хосты

A

Предыдущая версия требует наличия только request line. В ней мы описываем, какой путь на сайте мы хотим посмотреть. Но упоминания сайта как такового здесь нет. При этом мы подключаемся по telnet к конкретному IP адресу. Отсюда можно сделать вывод, что понятие домена (доменного имени) при использовании HTTP 1.0 неважно. Действительно, эта версия была создана в те времена, когда считалось, что один IP адрес соответствует одному сайту. Естественно, это не могло продолжаться долго, потому что рост интернета был стремительным. И HTTP 1.1 ввел такое понятие как виртуальные хосты. С точки зрения реализации в протоколе HTTP появилась одна небольшая деталь. Кроме request line стал обязательным еще и заголовок, который называется host. Он определяет, какой именно домен должен быть возвращен с этого IP адреса.

HEAD / HTTP/1.1
host: hexlet.io

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

HTTP 1.1 вводит еще одно понятие по умолчанию, которое называется keep-alive

A

keep-alive означает, что соединение TCP, по которому ходит HTTP, не закрывается. Причем по умолчанию так должны себя вести все веб-сервера. Основная цель введения этой фичи в том, чтобы сократить использование ресурсов, уменьшить нагрузку на процессор, открывать меньше TCP-соединений (установка каждого TCP-соединения занимает время), уменьшить время ожидания (latency). Когда мы открываем сайт, то обычно с одного домена грузится несколько ресурсов. keep-alive позволяет открывать и использовать одно соединение, которое не будет закрыто до тех пор, пока это не будет указано явно, либо не произойдет таймаут. Таймаут зависит от того, какой браузер и какой веб-сервер используется.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Закрытие соединения HTTP1.1

A

Мы также можем указать, что хотим закрыть соединение. Для этого после установки соединения и передачи стандартных заголовков нужно передать еще один заголовок. Он называется connection: close. Тогда keep-alive будет отключен, и после получения ответа мы увидим сообщение, что хост закрыл соединение: Connection closed by foreign host.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Чем по сути является HTTP?

A

Искусственным общим языком для передачи данных

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Что из перечисленного является особенностью HTTP версии 1.1?

A

Возможность повторно использовать TCP-соединение вместо создания нового соединения при каждом запросе

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Код 301 это

A

Код ответа

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Тело HTTP-запроса

A

Строка запроса
Заголовки
Пустая строка
Тело запроса

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Как передается тело ответа

A

Во время отправки ответа сервер формирует специальный заголовок, который называется Content-Length. Перед тем как отправить тело ответа, происходит вычисление его длины и записывается количество байт.
После того, как передан такой заголовок, другая сторона будет ожидать ровно столько байт, сколько в нем указано.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Дополнительный заголовок кроме Content-Length

A

не все серверы правильно работают при наличии только заголовка Content-Length. Им не хватает еще одного. Тип содержимого запроса или ответа, которое содержит body, должен быть как-то идентифицирован.
Когда сервер не может определить тип контента, он должен использовать заголовок Content-Type: application/octet-stream. Это означает, что в теле запроса передается просто поток байт.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Можно ли посылать body в любых формах запросов?

A

С точки зрения стандарта HTTP тело может присутствовать в любом запросе и никак не связано с глаголом. Посылать body можно в HEAD, POST, PUT и других запросах. Если мы посылаем body с GET, сервер никак не будет на это реагировать, более того, он и не должен, так как с практической точки зрения это не имеет смысла.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Что должен содержать ответ при выполнении запроса с использованием глагола HEAD?

A

заголовки

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Какое значение содержится в поле “Content-Length” в ответе (response)?

A

количество байт, занимаемое телом ответа

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Content-Length может присутствовать

A

и в запросе, и в ответе

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Пример пост запроса с бади

A
POST /upload HTTP/1.1
Host: hexlet.local
Content-Type: text/plain
Content-length: 15

my request body
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Что такое форма?

A

Формы — это элементы HTML, которые применяются для сбора информации от посетителей веб-сайта

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

Content-Type для форм по умолчанию

A

Content-Type: application/x-www-form-urlencoded

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Пример отправленной формы

A

Это простой формат — ключ равно значение и амперсанд между ними.

login=smith&password=12345678

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Пример запроса с данными формы

A
telnet localhost 8080

POST /login HTTP/1.1
Host: hexlettesthost.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

login=smith&password=12345678 # отправляем данные
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Как определяется длина Content-Length?

A

Количество символов

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Особенности парсинга символов тела запроса

A

= выглядит так — %3D

34
Q

JSON Content-Type

A

Content-Type: application/json

35
Q

В какой части HTTP-запроса находятся данные формы при ее отправке глаголом POST?

A

в теле

36
Q

Как разделяются названия полей формы в HTTP-запросе, если она отправлена GET-глаголом:

A

&

37
Q

Может ли ответ на HTTP-запрос (то есть HTTP response) содержать тело с какой-то информацией?

A

да, конечно!

38
Q

Пример POST запроса для логина

A
POST /session/new HTTP/1.1
Host: hexlet.local
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=admin&password=secret
39
Q

Передача данных без конечного размера

A

Существует еще одно решение, которое позволяет надежно передавать данные, когда мы не знаем их конечный размер. По ссылке находится пример изображения, которое отрисовывается постепенно по мере того, как происходит передача данных. Для этого используется механизм передачи небольшими частями, чанками (англ. chunks), и специальный заголовок Transfer-Encoding со значением chunked

40
Q

Пример передачи чанка

A
Заголовки
Date: Fri, 10 Jul 2020 09:18:05 GMT

400 # длина чанка
Какие-то данные первого чанка
400
Данные второго чанка
400
и так далее
0 # последний чанк нулевой длины
41
Q

С чего начинается каждый chunk?

A

число, указывающее на его размер

42
Q

Чем заканчивается каждый chunk?

A

перевод строки

43
Q

Каким образом обозначается последний chunk?

A

он нулевой длины, после него — двойной перевод строки

44
Q

В случае с передачей ответа с помощью chunks, каким образом тело ответа отделяется от заголовков?

A

как обычно — два перевода строки

45
Q

Передача данных query string

A

POST /login?key=value HTTP/1.1
мы также можем передать так называемую строку запроса query string. Это параметры ключ=значение, которые располагаются в request line после указания глагола POST или GET.

46
Q

query string без указания страницы

A

GET /?key=value HTTP/1.1

47
Q

Какой из типов запросов должен использоваться только для получения данных и не должен приводить к изменениям данных?

A

GET

48
Q

Какой из типов запросов лучше всего поддается кэшированию (если запросы используются правильно)?

A

GET

49
Q

Возможно ли в одном запросе передавать данные и в body, и в request line с помощью query string?

A

да

50
Q

Запрос публикует новый комментарий в блоге. Является ли такой запрос идемпотентным?

A

нет

51
Q

Пример редиректа в заголовках

A

telnet hexlet.io 80
GET / HTTP/1.1
host: hexlet.io

HTTP/1.1 301 Moved Permanently
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://hexlet.io/

52
Q

Возможно в ответ 301 включить тело?

A

да

53
Q

При ответе “301” новый адрес указан в поле “Location”. Чем является это поле?

A

При ответе “301” новый адрес указан в поле “Location”. Чем является это поле?

54
Q

Возможно ли делать редирект на страницу, которая в свою очередь содержит новый редирект на другую страницу?

A

Да

55
Q

Ответ при попытке зайти на защищенную страницу

A
HTTP/1.1 401 Access Denied
WWW-Authenticate: Basic realm="My Server"
Content-Length: 0
56
Q

Пример запроса на защищенную страницу

A
GET /securefiles/ HTTP/1.1
Host: www.httpwatch.com
Authorization: Basic aHR0cHdhdGNoDmY=
57
Q

Что представляет собой заголовок Base?

A

Authorization, в котором есть обязательное слово Basic и после пробела закодированая фраза. Эта фраза состоит из имени пользователя и пароля — <username>:<password>, закодированных в base64.</password></username>

58
Q

Какой код используется для обозначения запрета доступа без аутентификации (“access denied”)?

A

401

59
Q

Какое из утверждений является истинным для базовой аутентификации?

A

форму для ввода логина и пароля генерирует сам браузер

60
Q

Возможно ли применить базовую аутентификацию только к одной странице на сайте?

A

да

61
Q

Как сгенерировать Base64 для логина-пароля

A

printf 'username:password' | base64

62
Q

«Как запомнить, что это тот пользователь, с которым мы только что работали?».

A

Решение этой проблемы было найдено когда был придуман механизм, который называется Cookie.

63
Q

Примеры заголовков cookie

A
set-cookie: _hexlet_session2=AiUPd6RFbcrnoGnZSLAYSBzdJqxsQ4sTc%2BW0xXuOKzle--qQi0cqcljC8i4klD--fXTErw9bhX7%2Fd1xfPE4Gww%3D%3D; domain=.hexlet.io; path=/; expires=Sun, 16 Aug 2020 03:38:11 GMT; secure; HttpOnly; SameSite=Lax

set-cookie: GCLB=CLTE8bzdlaS6Zg; path=/; HttpOnly; expires=Thu, 16-Jul-2020 03:39:50 GMT
64
Q

Куки делятся как минимум на два типа

A

сессионные и постоянные

65
Q

Основное отличие сессионных куки от постоянных

A

Основное их отличие от постоянных в том, что такая кука удаляется при закрытии браузера.

66
Q

Пример сессионных куки

A

Наглядный пример — это механизм работы галочки «запомнить меня». Если вы авторизуетесь и не отметите эту галочку, а потом закроете браузер и снова зайдете на сайт, то будете не авторизованы. Так происходит потому, что используется сессионная кука.

67
Q

Особенности постоянных куки

A

Постоянные куки сохраняются на жестком диске — место их хранения может быть разным в зависимости от браузера. Такие куки отличаются от сессионных тем, что можно управлять длиной их жизни при помощи параметра expires:

expires=Thu, 16-Jul-2020 03:39:50 GMT

68
Q

Дополнительный параметр, кроме expires

A

MAX-AGE. В его значении указывается количество секунд, по истечении которых кука будет удалена:

MAX-AGE=2592000;

69
Q

Особенности работы браузеров с параметрами max-age и expires

A

Так как часть браузеров не поддерживают MAX-AGE, некоторые фреймворки часто устанавливают сразу оба параметра и браузеры просто игнорируют тот, который им не нужен. Таким образом заголовок set-cookie, который содержит два параметра MAX-AGE и expires, считается валидным. В стандарте также говорится, что регистр имени куки не имеет значения.

70
Q

Область видимости куки

A

Это URL, на которые кука может отправляться. Если они не заданы, то по умолчанию кука будет пересылаться на сервер только для текущего пути и домена. В нашем примере в path указан корень сайта, то есть кука будет отправляться для всех страниц:

domain=.hexlet.io; path=/;

71
Q

Область видимости для поддоменов

A

Если установлен domain=.hexlet.io, то кука будет работать не только для всех страниц сайта, но и для всех поддоменов — при этом наличие точки перед именем домена не имеет значения. Если мы совсем не установим параметр domain, то кука для поддоменов работать не будет, хотя по умолчанию значение домена будет hexlet.io.

72
Q

Как определяется уникальность куки

A

Уникальность куки определяется тремя параметрами key (имя куки), domain и path. Это значит, что если какую-то куку нужно переустановить, то при следующем запросе в set-cookie эти параметры должны совпадать. Если хотя бы один из них отличается, то будет установлена новая кука.

73
Q

Удаление куки

A

Заголовка для удаления куки не существует. Чтобы удалить ее, нужно установить нулевой или отрицательный MAX-AGE, либо задать expires в прошлом, тогда кука будет немедленно удалена.

74
Q

HttpOnly cookie

A

в нашем примере установлен дополнительный параметр HttpOnly. HttpOnly-куки передаются с AJAX-запросами, но их нельзя получить через JavaScript на странице сайта. Это дополнительный уровень безопасности от XSS-атак.

75
Q

HTTP — stateless protocol. Что это значит?

A

каждая пара «HTTP-запрос + ответ» независимая, и протокол не «помнит» ничего о прошлых запросах

76
Q

Может ли заголовок “Set-cookie” встречаться несколько раз в одном ответе (response)?

A

да

77
Q

Где у пользователя хранятся cookie, отправленные сервером?

A

в браузере

78
Q

В куки есть такой фрагмент: domain = .yandex.ru. Для каких адресов будет использоваться этот куки?

A

для yandex.ru и всех поддоменов вида x.yandex.ru

79
Q

Пользователь зашел на сайт интернет-магазина (без авторизации, как гость), добавил несколько товаров в свою корзину, закрыл браузер, перезагрузил компьютер, открыл браузер, вернулся на сайт и увидел, что товары все еще находятся в его корзине. Какой тип cookie использовался (скорее всего) для достижения такого эффекта?

A

постоянные куки (persistent cookies)

80
Q

Пример запроса с куки

A
GET /account HTTP/1.1
Host: hexlet.local
Cookie: name=user; secret=secret_hash