HTTP๋
HTTP(HyperText Transfer Protocol)๋ ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ํ๋กํ ์ฝ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์ด๊ฑฐ๋, ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋, ๋ชจ๋ HTTP๋ฅผ ์ฌ์ฉํฉ๋๋ค. HTTP๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๊ฐ ์๋ต์ ๋ฐํํฉ๋๋ค. ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ธํฐ๋ท ์๋น์ค์ ๋๋ถ๋ถ์ HTTP๋ฅผ ํตํด ์๋ํ๊ณ ์์ต๋๋ค.
HTTP์ ํน์ง
- ๋น์ฐ๊ฒฐ์ฑ(Connectionless)
- HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ๊ณผ ์๋ต์ด ์๋ฃ๋๋ฉด ์ฐ๊ฒฐ์ ๋์ต๋๋ค.
- ๊ฐ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ์๋ฒ๋ ์ด์ ์์ฒญ์ ์ํ๋ฅผ ์ ์งํ์ง ์์ต๋๋ค.
- ์ด๋ก ์ธํด ์๋ฒ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง, ์ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ค๋ฉด ๋ณ๋์ ๋ฉ์ปค๋์ฆ(์ธ์ , ์ฟ ํค ๋ฑ)์ด ํ์ํฉ๋๋ค.
- ๋ฌด์ํ์ฑ(Stateless)
- HTTP๋ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋ ํ๋กํ ์ฝ์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ด์ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฒ๊ฐ ๊ธฐ์ตํ์ง ์์ต๋๋ค.
- ๋ฐ๋ผ์ ๋ชจ๋ ์์ฒญ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ฟ ํค, ์ธ์ , ํ ํฐ ๋ฑ์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ํ์ฅ์ฑ(Extensibility)
- HTTP๋ ํ์ฅ์ด ์ฌ์ด ํ๋กํ ์ฝ์ ๋๋ค. ๋ค์ํ ํค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ์๋กญ๊ฒ ์ ์๋ ๋ฉ์๋์ ์ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
HTTP์ ๊ตฌ์ฑ ์์
HTTP ์์ฒญ(Request)
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฃผ์ ๊ตฌ์ฑ
- ์์ฒญ ๋ฉ์๋(Method): GET, POST, PUT, DELETE ๋ฑ
- URL: ์์ฒญ ๋ฆฌ์์ค์ ์ฃผ์
- ํค๋(Header): ๋ฉํ๋ฐ์ดํฐ(์: ์ธ์ฆ ์ ๋ณด, ํด๋ผ์ด์ธํธ ์ ๋ณด)
- ๋ณธ๋ฌธ(Body): ํ์ํ ๊ฒฝ์ฐ ์์ฒญ ๋ฐ์ดํฐ ํฌํจ
// ํค๋
POST /api/users HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Content-Length: 85
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... // (JWT์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)
// ๋ฐ๋
{
"username": "Daniel",
"email": "daniel@example.com",
"password": "1234"
}
HTTP ์๋ต(Response)
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฃผ์ ๊ตฌ์ฑ
- ์ํ ์ฝ๋(Status Code): ์์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ์ซ์ (์: 200 OK, 404 Not Found)
- ํค๋(Header): ์๋ต ๋ฉํ๋ฐ์ดํฐ (์: ์ฝํ ์ธ ํ์ )
- ๋ณธ๋ฌธ(Body): ์์ฒญํ ๋ฆฌ์์ค ๋ฐ์ดํฐ ํฌํจ
// ์ํ ์ฝ๋
HTTP/1.1 200 OK
// ํค๋
Date: Tue, 19 Nov 2024 12:00:00 GMT
Server: Apache/2.4.54 (Unix)
Content-Type: text/html
Content-Length: 137
// ๋ฐ๋
<!DOCTYPE html>
<html lang="en">
<head>
<title>Welcome</title>
</head>
<body>
<h1>Welcome to example.com</h1>
</body>
</html>
HTTP ๋ฉ์๋
HTTP ๋ฉ์๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ด๋ค ๋์์ ์์ฒญํ ์ง ์ ์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ, ์์ฑ, ์์ , ์ญ์ ๋ฑ์ ์์
์ ์ํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
GET
๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค.
ํน์ง
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ์์ฒญ.
- ์์ฒญ ๋ณธ๋ฌธ(Body)์ ํฌํจํ์ง ์์ต๋๋ค.
- ์์ฒญํ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค(์์ ์ฑ).
GET /api/users HTTP/1.1
Host: example.com
POST
๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ์๋ฒ์ ์ ์กํฉ๋๋ค.
ํน์ง
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
- ๋ณดํต ์์ฒญ ๋ณธ๋ฌธ(Body)์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค.
- ์๋ฒ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค(์์ ํ์ง ์์).
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "Daniel",
"email": "daniel@example.com",
"password": "1234"
}
PUT
๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์ ์ฒด ์ ๋ฐ์ดํธํ๊ฑฐ๋, ๋ฆฌ์์ค๋ฅผ ์์ฑํฉ๋๋ค.
ํน์ง
- ์์ฒญ ๋ณธ๋ฌธ(Body)์ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค.
- ์ง์ ๋ ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์๋ก ์์ฑํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ(๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ๋ณด๋ด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํจ)์ ๋ณด์ฅํฉ๋๋ค.
PUT /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"username": "Hani",
"email": "hani@example.com",
"password": "5678"
}
// ID๊ฐ 123์ธ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋, ์์ผ๋ฉด ์๋ก ์์ฑํฉ๋๋ค.
PATCH
๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ถ ์ ๋ฐ์ดํธํฉ๋๋ค.
ํน์ง
- PUT๊ณผ ๋ฌ๋ฆฌ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ์์ ํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ ์ ์์ง๋ง, ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
PATCH /api/users/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"email": "updated@example.com"
}
// ID๊ฐ 123์ธ ์ฌ์ฉ์์ ์ด๋ฉ์ผ๋ง ์์ ํฉ๋๋ค.
DELETE
๋ชฉ์
๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
ํน์ง
- ์๋ฒ์์ ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ(๊ฐ์ ์์ฒญ์ ๋ฐ๋ณตํด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผํจ)์ ๋ณด์ฅํฉ๋๋ค.
DELETE /api/users/123 HTTP/1.1
Host: example.com
// ID๊ฐ 123์ธ ์ฌ์ฉ์๋ฅผ ์ญ์ ํฉ๋๋ค.
HEAD
๋ชฉ์
GET๊ณผ ๋์ผํ์ง๋ง, ๋ณธ๋ฌธ(Body)์ ํฌํจํ์ง ์๊ณ ํค๋๋ง ๋ฐํํฉ๋๋ค.
ํน์ง
- ๋ฆฌ์์ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ณธ๋ฌธ์ ์ ์กํ์ง ์์ผ๋ฏ๋ก ํจ์จ์ ์ ๋๋ค.
HEAD /api/users HTTP/1.1
Host: example.com
HTTP ์ํ ์ฝ๋
์ฝ๋ | ๋ฒ์ฃผ | ์ค๋ช |
1xx | ์ ๋ณด(Informational) | ์์ฒญ์ ์ฒ๋ฆฌ ์ค |
2xx | ์ฑ๊ณต(Successful) | ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ |
3xx | ๋ฆฌ๋ค์ด๋ ์ (Redirection) | ์ถ๊ฐ ์์ (๋ฆฌ๋ค์ด๋ ์ )์ด ํ์ |
4xx | ํด๋ผ์ด์ธํธ ์ค๋ฅ(Client Error) | ํด๋ผ์ด์ธํธ์ ์๋ชป๋ ์์ฒญ |
5xx | ์๋ฒ ์ค๋ฅ(Server Error) | ์๋ฒ์์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํจ |
HTTP vs HTTPS
HTTP (HyperText Transfer Protocol)
- ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ง ์๊ณ ์ ์ก
HTTPS (HTTP Secure)
- ๋ฐ์ดํฐ๋ฅผ SSL/TLS๋ก ์ํธํํ์ฌ ์ ์ก
HTTP์ ํ์ฉ ์ฌ๋ก
RESTful API
- HTTP๋ REST(Representational State Transfer) ์ํคํ ์ฒ์ ๊ธฐ๋ฐ ํ๋กํ ์ฝ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ํ์ฉํด ์๋ฒ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ณ ์กฐ์ํฉ๋๋ค.
- RESTful API๋ ์น ์๋น์ค์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ฐ๋จํ๊ณ ์ผ๊ด๋ ๋ฐ์ดํฐ ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ง
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ์ฉ ์ฌ๋ก๋ก, ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ URL์ ์ ๋ ฅํ๋ฉด HTTP๋ฅผ ํตํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์์ฒญํ ์น ํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์๋ต์ผ๋ก ๋ฐํํฉ๋๋ค.
- HTTP์ ์์ฒญ-์๋ต ๋ชจ๋ธ์ ์ฌ์ฉ์๊ฐ ์ํ๋ ์น ์ฝํ ์ธ ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ต๋๋ค.
๋ชจ๋ฐ์ผ ์ฑ ํต์
- ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐฑ์๋ ์๋ฒ ๊ฐ์ ํต์ ์ ์ํด HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
HTTP๋ ์น์ ์ค์ฌ์ ์๋ ํ๋กํ ์ฝ์ด๋ค.
HTTP๋ ๋จ์ํ ์น ๋ธ๋ผ์ฐ์ง๋ถํฐ ๋ชจ๋ฐ์ผ ์ฑ, IoT, RESTful API, ์คํธ๋ฆฌ๋ฐ ์๋น์ค ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํ์ฉ๋๋ฉฐ, ์น๊ณผ IT ์ธํ๋ผ์ ํต์ฌ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. ๋จ์์ฑ๊ณผ ์ ์ฐ์ฑ์ผ๋ก ์ธํด HTTP๋ ์ธํฐ๋ท ํ๊ฒฝ์์ ๋ฐ์ดํฐ ๊ตํ์ ํ์ค์ด ๋์์ต๋๋ค.