HTTP (HyperText Transfer Protocol)
HTTP๋?
HTTP(HyperText Transfer Protocol)๋ ์น ์๋ฒ์ ์น ํด๋ผ์ด์ธํธ ๊ฐ์ ํต์ ์ ์ํ ํ๋กํ ์ฝ์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์์ฒญ์ ๋ํ ์๋ต์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
HTTP์ ์ผ๋ฐ์ ์ธ ๋์์ ์ด๋ฏธ์ง์ฒ๋ผ TCP ์์์ ์ํ๋๋ค. ์ด๋ฏธ ์ฐ๊ฒฐ์ด ๋งบ์ด์ก๋ค๋ ๊ฐ์ ํ์, ๋ฉ์ธ์ง๋ฅผ ๊ตํํ๋ ๋ฐฉ์์ด๋ค.
๊ฐ ์ฅ์น์์๋ TCP ์ธ๊ทธ๋จผํธ์ ํ์ด๋ก๋๋ฅผ HTTP ๋ฉ์ธ์ง๋ก, ํ์คํ๋ ๊ท๊ฒฉ์ ๋ง๊ฒ ํด์ํ์ฌ ์ฒ๋ฆฌํ๋ค. HTTP/1.1์ 1999๋ ์ ํ์คํ๋์์ผ๋ฉฐ, ํ์ฌ๋ HTTP/2 ๋ฑ ์์ ๋ฒ์ ๋ ๋์์๋ค.
HTTP ๋ฉ์ธ์ง ๊ตฌ์กฐ
HTTP๋ ์ํ๊ฐ ์๋(Stateless) ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ ์ด์ ์์ฒญ๋ค์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๋ฉ์ธ์ง๋ ํฌ๊ฒ ์์ฒญ(Request) ๋ฉ์ธ์ง์ ์๋ต(Response) ๋ฉ์ธ์ง๋ก ๋๋๋ฉฐ ๊ฐ ๋ฉ์ธ์ง๋ ํ์ค ๊ท๊ฒฉ์ ๋ฐ๋ฅธ๋ค.
์์ฒญ ๋ฉ์ธ์ง
HTTP ๋ฉ์ธ์ง๋ ์์ฒญ ๋ผ์ธ, ํค๋, ๋ณธ๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์์ ์์๋ ์ดํด๋ฅผ ์ํด ์์ฒญ ๋ผ์ธ๊ณผ ํค๋๋ฅผ ์์๋ณด์.
Request Line
- Method: ์์ฒญ ๋ฐฉ์์ ๋ํ๋ธ๋ค. (GET, POST, PUT, DELETE ๋ฑ)
- Request-URI: ์์ฒญ ๋์์ ๋ฆฌ์์ค๋ฅผ ๋ํ๋ธ๋ค.
- Protocol: HTTP ํ๋กํ ์ฝ์ ๋ฒ์ ์ ๋ํ๋ธ๋ค.
์์ฒญ ๋ผ์ธ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ๋ฆฌ์์ค์ ๋ํ์ฌ ์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฒญํ๋์ง ์ ์ด๋ค ํ๋กํ ์ฝ์ ๋ฒ์ ์ผ๋ก ์ฒ๋ฆฌ์ ๋ํด ์์ฒญํ๋์ง๋ฅผ ๋ํ๋ธ๋ค.
Header
- Host: ์์ฒญ ๋์์ ํธ์คํธ๋ฅผ ๋ํ๋ธ๋ค.
- User-Agent: ์์ฒญ์ ๋ณด๋ด๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค.
- Accept: ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์๋ค์ผ ์ ์๋ ์ปจํ ์ธ ํ์ ์ ๋ํ๋ธ๋ค.
- Content-Type: ์์ฒญ ๋ณธ๋ฌธ์ ํ์ ์ ๋ํ๋ธ๋ค.
- Content-Length: ์์ฒญ ๋ณธ๋ฌธ์ ๊ธธ์ด๋ฅผ ๋ํ๋ธ๋ค.
ํค๋์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ ๋ฆฌ์์ค์ ๋ํ์ฌ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. ์ด๋ฏธ์ง์์๋ ์ผ๋ถ ํค๋๊ฐ ์๋ต ๋์์ง๋ง, ์ค์ ๋ก Content-Length ๊ฐ์ด ์์ฒญ์ ๋์ ์ ์ ์์ด ๋ฉ์ธ์ง ํด์์ด ์ด๋ ค์ด ๊ฒฝ์ฐ TCP ์ฐ๊ฒฐ์ข ๋ฃ ๋์ ํ๋จํ๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ HTTP ํด๋ผ์ด์ธํธ๋ ๊ธฐ๋ณธ์ ์ธ ํค๋๋ฅผ ํฌํจ๋๊ฒ ๋์ด์๋ค.
์๋ต ๋ฉ์ธ์ง
HTTP ์๋ต ๋ฉ์ธ์ง๋ ์ํ ๋ผ์ธ, ํค๋, ๋ณธ๋ฌธ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ์์ ์์๋ ์ดํด๋ฅผ ์ํด ์ํ ๋ผ์ธ๊ณผ ํค๋๋ฅผ ์์๋ณด์.
Status Line
- Protocol: HTTP ํ๋กํ ์ฝ์ ๋ฒ์ ์ ๋ํ๋ธ๋ค.
- Status-Code: ์์ฒญ์ ๋ํ ์๋ต ์ํ ์ฝ๋๋ฅผ ๋ํ๋ธ๋ค.
-
์ ์ฒด ๋ฒ์ ์ ์๋ ๋ฒ์ ๋ถ๋ฅ 1xx 100 ~ 101 ์ ๋ณด 2xx 200 ~ 206 ์ฑ๊ณต 3xx 300 ~ 305 ๋ฆฌ๋ค์ด๋ ์ 4xx 400 ~ 415 ํด๋ผ์ด์ธํธ ์๋ฌ 5xx 500 ~ 505 ์๋ฒ ์๋ฌ
-
- Reason-Phrase: ์ํ ์ฝ๋์ ๋ํ ์ค๋ช
์ ๋ํ๋ธ๋ค.
-
์ํ ์ฝ๋ ์ฌ์ ๊ตฌ์ ์๋ฏธ 200 OK ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ 404 Not Found ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์ 500 Internal Server Error ์๋ฒ ๋ด๋ถ ์๋ฌ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์
-
์ํ ๋ผ์ธ์์๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ตํ๋ ์ํ ์ฝ๋์ ๊ทธ์ ๋ํ ์ค๋ช ์ ๋ํ๋ธ๋ค.
์ํ ์ฝ๋๋ RFC9110์ ์ ์๋์ด ์์ผ๋ฉฐ, ์ํ ์ฝ๋์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋์ง ์ ์ ์๋ค. ์ด๋ ์ฌ์ ๊ตฌ์ ๊ณผ ํ๊ฐ์ ์ํ ์ ๋ณด๋ก ์ฌ์ฉ๋๋ค.
Header
- Server: ์๋ฒ์ ์ ๋ณด๋ฅผ ๋ํ๋ธ๋ค.
- Content-Type: ์๋ต ๋ณธ๋ฌธ์ ํ์ ์ ๋ํ๋ธ๋ค.
- Content-Length: ์๋ต ๋ณธ๋ฌธ์ ๊ธธ์ด๋ฅผ ๋ํ๋ธ๋ค.
- Date: ์๋ต์ ๋ณด๋ธ ์๊ฐ์ ๋ํ๋ธ๋ค.
- Connection: ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
๋ฉ์ธ์ง ๋ณธ๋ฌธ
HTTP
๋ฉ์ธ์ง์ ์์ฒญ๋ผ์ธ๊ณผ ์ํ๋ผ์ธ ๊ทธ๋ฆฌ๊ณ ํค๋๊ฐ ๋ฉ์ธ์ง์ ๋ํ ์ค์ ์ ๋ณด๋ผ๋ฉด ๋ณธ๋ฌธ์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ถ๋ถ์ด๋ค.
HTTP ๋ฉ์ธ์ง ํด์์ ๋ณธ๋ฌธ์ ์๊ธฐ ์ํด์๋, ๋ฉ์ธ์ง ์ ์ฒด๋ฅผ ๋ณผ ํ์๊ฐ์๋ค.
๋จผ์ ๋ฉ์ธ์ง ์์์ ์๊ธฐ์ํด Header
์ Body
๋ฅผ ๊ตฌ๋ถํ๋ ๊ฐํ์ด ํ์ํ๋ค. http ๋ฉ์ธ์ง๋ ํ์ค ์คํธ๋ฆผ์ผ๋ก ์ฝ๊ธฐ ๋๋ฌธ์ ๋์ ์์๊ฐ ์๋ค.
๋ฐ๋ผ์ ๋ฉ์ธ์ง ํค๋์ Content-Length
๋ฅผ ํตํด ๋ณธ๋ฌธ์ ๊ธธ์ด๋ฅผ ์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ณธ๋ฌธ์ ๋์ ์ ์ ์๋ค.
์ด๋ฏธ์ง์๋ ์์ฒญ ๋ณธ๋ฌธ์ด application/x-www-form-urlencoded
ํ์์ผ๋ก ๋์ด์๊ณ , ์๋ต ๋ณธ๋ฌธ์๋ application/html
ํ์์ผ๋ก ๋์ด์๋๊ฑธ ์ ์ ์๋ค.
๋ฉ์ธ์ง๋ฅผ ๋ฐ๋ ๋์์ด ์ฌ๋ฐ๋ฅด๊ฒ ํด์ํ ์ ์๋๋ก Content-Type
์ ํตํด ๋ณธ๋ฌธ์ ํ์
์ ์๋ ค์ค๋ค.
HTTP Header Options
HTTP๋ TCP ์์์ ๋์ํ๊ธฐ ๋๋ฌธ์, HTTP ํค๋ ์ต์
์ผ๋ก TCP์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด Keep-Alive
ํค๋๋ ํน์ ์๊ฐ๋์ ์์ฒญ์ ์ธ์
์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ค.
Keep-Alive
Keep-Alive
๋ TCP ์คํ์ ์ง์ ์ฐ๊ฒฐ(Persistent Connection
)์ ์ด์ฉํ์ฌ, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ฐ๊ฒฐ์ ์ ์งํ๋ ๊ธฐ๋ฅ์ด๋ค.
GET /index.html HTTP/1.1
Host: www.example.com
Connection: Keep-Alive
Keep-Alive: timeout=60, max=1000
...
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ด Connection
์ Keep-Alive
๋ก ์ค์ ๋์ด ์๊ณ , Keep-Alive
ํค๋์๋ timeout
๊ณผ max
๋ฅผ ์ค์ ํ์๋ค.
์ด ๊ฒฝ์ฐ 60์ด ๋์ ์ธ์
์ ์ ์งํ๊ณ , ์ต๋ 1000๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ ๋ ์ค ํ๋๊ฐ ๋จผ์ ๋๋ฌํ๋ฉด ์ธ์
์ ์ข
๋ฃํ๋ค.
Keep-Alive
๋ ์ธ์
๊ณ์ธต์ผ๋ก์์ ๊ตฌํ์ด๋ค.