HTTP ์๋ต
2025. 6. 24. 23:14ใ๋คํธ์ํฌ
๋ฐ์ํ
๐ฆ HTTP ์๋ต ๊ตฌ์กฐ
HTTP/1.1 200 OK ← โ
[1. ์ํ ์ฝ๋ (Status)]
Content-Type: text/html ← โ
[2. ํค๋ (Headers)]
Content-Length: 123
<html>...</html> ← โ
[3. ๋ณธ๋ฌธ (Body)]
โ 1. ์ํ ์ฝ๋ (Status Code)
HTTP ์๋ต์ ์ํ๋ฅผ 3์๋ฆฌ ์ซ์๋ก ํํํ๋ฉฐ, 5๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ฉ๋๋ค:
๋ฒ์ฃผ์ฝ๋์๋ฏธ
1xx | 100~199 | ์ฒ๋ฆฌ ์ค (์ ๋ณด ์ ๊ณต) |
2xx | 200~299 | ์ฑ๊ณต |
3xx | 300~399 | ๋ฆฌ๋ค์ด๋ ํธ |
4xx | 400~499 | ํด๋ผ์ด์ธํธ ์ค๋ฅ |
5xx | 500~599 | ์๋ฒ ์ค๋ฅ |
๐ ์์ฃผ ์ฐ๋ ์ํ ์ฝ๋
์ํ ์ฝ๋์๋ฏธ์ค๋ช
200 OK | ์ฑ๊ณต | ์ผ๋ฐ์ ์ธ ์ฑ๊ณต |
201 Created | ์์ฑ๋จ | POST ์์ฒญ์ผ๋ก ์์์ด ์์ฑ๋จ |
204 No Content | ๋ณธ๋ฌธ ์์ | ์๋ต ๋ณธ๋ฌธ์ด ์์ |
301 Moved Permanently | ์๊ตฌ ์ด๋ | URL์ด ๋ฐ๋ |
302 Found | ์์ ์ด๋ | ๋ค๋ฅธ URL๋ก ์์ ์ด๋ |
400 Bad Request | ์๋ชป๋ ์์ฒญ | ํ๋ผ๋ฏธํฐ, ๋ฌธ๋ฒ ์ค๋ฅ ๋ฑ |
401 Unauthorized | ์ธ์ฆ ํ์ | ํ ํฐ ๋๋ฝ ๋ฑ |
403 Forbidden | ์ ๊ทผ ๊ธ์ง | ๊ถํ ๋ถ์กฑ |
404 Not Found | ์ฐพ์ ์ ์์ | URL ๋์์ด ์กด์ฌํ์ง ์์ |
409 Conflict | ์ถฉ๋ | ์ค๋ณต๋ ๋ฆฌ์์ค ๋ฑ |
500 Internal Server Error | ์๋ฒ ์ค๋ฅ | ์์ธ ๋ฐ์ ๋ฑ |
503 Service Unavailable | ์๋น์ค ๋ถ๊ฐ | ์๋ฒ ๊ณผ๋ถํ ๋ฑ |
โ 2. ํค๋ (Headers)
ํค๋๋ ๋ฉํ๋ฐ์ดํฐ์ ๋๋ค. ์ฆ, ๋ณธ๋ฌธ์ ํ์, ๊ธธ์ด, ์บ์, ์ฟ ํค ๋ฑ์ ๋ํ ์ ๋ณด ์ ๊ณต ์ญํ ์ ํฉ๋๋ค.
๐ ๋ํ์ ์ธ HTTP ์๋ต ํค๋
ํค๋์๋ฏธ์์
Content-Type | ์๋ต ๋ณธ๋ฌธ์ ๋ฐ์ดํฐ ํ์ | application/json, text/html |
Content-Length | ์๋ต ๋ฐ๋์ ๊ธธ์ด (byte) | 342 |
Set-Cookie | ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค ์ค์ ์ง์ | Set-Cookie: token=abc123 |
Cache-Control | ์บ์ฑ ์ ์ฑ | no-cache, max-age=3600 |
Location | ๋ฆฌ๋ค์ด๋ ํธ ๋์ ์์น | Location: /new-url |
WWW-Authenticate | ์ธ์ฆ ํ์ ์ ์ฌ์ฉ | Bearer realm="example" |
Access-Control-Allow-Origin | CORS ํ์ฉ ๋๋ฉ์ธ | * ๋๋ https://domain.com |
โ 3. ๋ณธ๋ฌธ (Body)
์๋ต ๋ณธ๋ฌธ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ ์ค์ ๋ฐ์ดํฐ์ ๋๋ค.
ํ์์ Content-Type์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ, ๋ํ์ ์ผ๋ก:
Content-Type ์ค๋ช ์์
application/json | JSON ๋ฐ์ดํฐ | { "name": "ํ๊ธธ๋" } |
text/html | HTML ์นํ์ด์ง | <html>...</html> |
text/plain | ์ผ๋ฐ ํ ์คํธ | ๋ก๊ทธ์ธ ์คํจ |
application/xml | XML ๋ฐ์ดํฐ | <user><name>ํ๊ธธ๋</name></user> |
application/octet-stream | ๋ฐ์ด๋๋ฆฌ ํ์ผ | ์ด๋ฏธ์ง, PDF ๋ฑ |
๐ ์ค์ ์์
HTTP/1.1 403 Forbidden
Content-Type: application/json
Content-Length: 42
{
"message": "๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค"
}
โ Spring์์์ ํํ (ResponseEntity ์์)
return ResponseEntity
.status(403)
.header("X-Custom-Header", "value")
.body(Map.of("message", "๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค"));
๐ ์์ฝ ์ ๋ฆฌ
๊ตฌ์ฑ ์์์ญํ ์์
์ํ ์ฝ๋ (Status) | ์ฑ๊ณต/์คํจ ์ ๋ณด | 200, 404, 500 ๋ฑ |
ํค๋ (Headers) | ๋ณธ๋ฌธ ์ค๋ช , ์ฟ ํค, ์บ์ ๋ฑ | Content-Type, Set-Cookie ๋ฑ |
๋ณธ๋ฌธ (Body) | ์ค์ ์๋ต ๋ฐ์ดํฐ | JSON, HTML, ํ ์คํธ ๋ฑ |
๋ฐ์ํ
'๋คํธ์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP ์์ฒญ (0) | 2025.06.24 |
---|