seegongsik
네트워크

어떻게 웹페이지를 주고받기, HTTP

주소창에 주소를 넣고 엔터를 누르면 잠시 뒤 페이지가 화면에 뜬다. 그 사이 보이지 않는 곳에서는 짧은 대화가 오간다. 브라우저가 '이 페이지 주세요' 하고 부탁하면 서버가 '여기 있어요' 하고 건네준다. 이 부탁과 건넴의 약속이 웹을 움직이는 HTTP예요.

01

이거 주세요, 여기 있어요

앞에서 TCP 덕분에 데이터가 빠짐없이 순서대로 도착하는 것을 보았다. 그렇다면 그렇게 실어 나른 데이터로 브라우저와 서버는 무슨 이야기를 나눌까?
웹에서 오가는 대화는 아주 단순하다. 브라우저가 서버에게 '이 페이지 주세요' 하고 부탁하면, 서버는 '여기 있어요' 하고 페이지를 건네준다. 부탁을 요청, 건넴을 응답이라고 불러요. HTTP는 이 요청과 응답을 어떤 모양으로 주고받을지 정해 둔 약속이다.

브라우저
GET 요청
>
<
응답 200
서버
브라우저를 눌러 요청을 보내요

브라우저를 눌러 서버에게 요청을 보내 보자. 서버가 응답을 돌려주면 한 쌍이 완성돼요.

요청 하나에 응답 하나. 웹은 이 단순한 짝으로 움직인다. 말을 먼저 거는 쪽은 늘 브라우저이고, 서버는 받은 요청에만 답한다. 서버가 먼저 찾아와 말을 거는 일은 없어요.
그래서 서버는 수많은 브라우저의 요청을 차례로 받아 하나씩 답하기만 하면 된다. 그런데 부탁에는 '이거 주세요'만 있는 것이 아니다. 요청마다 무엇을 하려는지 밝히는 동작이 붙는데, 다음에 그 동작을 살펴보자.

02

요청에 붙는 동작

모든 요청에는 무엇을 하고 싶은지 알리는 동작이 붙는다. 가장 흔한 것은 GET으로, '이것을 주세요' 하고 받아오는 동작이다. 페이지를 열 때마다 브라우저가 보내는 요청이 바로 GET이에요.
반대쪽에는 POST가 있다. '이것을 받아 주세요' 하고 서버로 보내는 동작이다. 글을 올리거나 로그인할 때 아이디와 비밀번호를 보내는 것처럼 말이에요. 받아오면 GET, 보내면 POST다.

GET과 POST를 눌러 골라봐요

동작을 눌러 골라 보자. GET은 받아오는 쪽, POST는 보내는 쪽이다. 동작마다 데이터가 어느 방향으로 가는지 화살표로 보여 줘요.

GET과 POST 두 가지만 알아도 웹에서 하는 일은 대부분 설명된다. 페이지를 열어 읽을 때는 GET, 무언가를 적어 보낼 때는 POST 요청을 쓴다.
응답에도 짧은 표시가 따라온다. 상태 코드라고 부르는 세 자리 숫자인데, 잘 처리됐으면 200, 그런 페이지가 없으면 404가 붙는다. 성공했는지 실패했는지를 숫자 하나로 알려 주는 셈이에요. 지금은 이 두 숫자만 기억해도 충분하다.

03

매번 처음 보는 손님처럼

HTTP에는 묘한 성격이 하나 있다. 요청 하나를 처리하고 나면 방금 누가 무엇을 부탁했는지 깨끗이 잊어버려요. 같은 사람이 두 번 찾아와도 매번 처음 보는 손님처럼 대한다.
'아까 오셨던 분이죠?' 같은 기억이 없는 것이다. 이렇게 지난 요청을 기억하지 않는 성질을 '상태가 없다'고 하고, 영어로는 stateless라고 불러요.

1번째 방문
같은 사람>서버
2번째 방문
같은 사람>서버
같은 사람으로 요청을 보내봐요

같은 사람으로 두 번 요청을 보내 보자. 두 번째에도 서버는 처음 본 듯 인사한다. HTTP는 지난 요청을 기억하지 않아요.

두 번째 방문에도 첫인사를 받으니 조금 답답해 보인다. 하지만 이것은 일부러 그렇게 만든 것이에요. 서버가 손님 하나하나를 기억하지 않아도 되니 일이 가볍고, 그만큼 수많은 요청을 동시에 받아 낼 수 있다.
대신 '아까 그 사람'을 알아보게 하려면 요청마다 따로 표식을 들려 보내야 한다. 그 표식이 조금 뒤 세션과 쿠키 레슨에서 만날 쿠키다.

04

조각을 모아 한 페이지로

웹 페이지 하나는 요청 한 번으로 다 오지 않는다. 브라우저는 먼저 글과 뼈대가 담긴 문서를 GET으로 받아온다. 문서를 읽어 보니 그림 파일과 꾸밈을 정한 파일도 필요하다고 적혀 있다.
그러면 브라우저는 그림을 달라, 꾸밈을 달라 하고 다시 요청을 보낸다. 이렇게 요청과 응답을 여러 번 주고받으며 조각을 하나씩 모아야 비로소 한 페이지가 완성돼요.

조각을 하나씩 눌러 요청해요

조각을 하나씩 눌러 요청해 보자. 글, 그림, 꾸밈이 응답으로 도착하며 페이지가 차례로 채워져요.

조각이 다 모이자 비어 있던 자리가 채워졌다. 우리 눈에는 한 번에 뜬 것처럼 보여도, 사실은 여러 번의 요청과 응답이 모인 결과다. 뼈대 하나, 그림 하나, 꾸밈 하나를 저마다 따로 부탁하고 따로 받아온 것이다.
큰 페이지라면 이런 요청이 수십 번, 많게는 백 번을 넘기도 해요. 그래도 인터넷이 빨라서 눈 깜짝할 사이에 끝나니, 우리는 그저 페이지가 떴다고 느낀다.

05

정리

한 줄로 모으면 이렇다. 웹은 요청과 응답 한 쌍으로 움직이고, 요청에는 GET(받아오기)이나 POST(보내기) 같은 동작이 붙는다. 응답에는 성공인지 실패인지 알리는 숫자가 따라온다.
한 페이지는 여러 번의 요청과 응답으로 조각을 모아 만들어요. 그리고 HTTP는 지난 요청을 기억하지 않아서 매 요청을 처음 보는 손님처럼 대한다. 이 단순함 덕분에 서버는 가볍게 많은 요청을 받아 낼 수 있다. 이것이 HTTP라는 약속이다.

이 강이 준 것을 차례로 눌러 정리해요

핵심을 차례로 눌러 되짚어 보자. (요청과 응답 → GET·POST 동작 → 지독한 건망증 → 조각을 모아 페이지)

이제 웹 페이지가 어떻게 오가는지 알았다. 브라우저가 요청하고 서버가 응답하는 것, 이것이 웹의 기본이다.
그런데 HTTP로 대화하는 것은 사람이 쓰는 브라우저만이 아니에요. 날씨 앱이 서버에서 오늘 날씨를 받아올 때처럼, 프로그램끼리도 HTTP로 데이터를 주고받는다. 다음 레슨에서는 프로그램이 다른 프로그램에게 일을 부탁하는 창구, API를 다룬다. 장바구니나 로그인 상태를 기억하는 방법은 그다음 세션과 쿠키 레슨에서 이어진다.

한 줄 정리웹은 요청과 응답 한 쌍으로 움직인다. 브라우저가 '이거 주세요'(요청) 하면 서버가 '여기 있어요'(응답) 하고 건네준다. 요청에는 GET(받아오기)이나 POST(보내기) 같은 동작이 붙어 무엇을 하려는지 알린다. 한 페이지는 보통 여러 번의 요청과 응답으로 글과 그림 조각을 모아 완성돼요. 그리고 HTTP는 지난 요청을 기억하지 않아서, 매 요청을 처음 보는 손님처럼 대해요. 이 빈자리를 채우는 방법은 세션과 쿠키 레슨에서 다룬다.
← 네트워크
이 페이지가 도움 됐다면 후원하기