๋ฉ์์ง์ ํ๋ฆ
- ๋ฉ์ธ์ง๋ ์ ์๋ฒ ๋ฐฉํฅ์ ์ธ๋ฐ์ด๋๋ก ํ์ฌ ์ก์
- ์ธ๋ฐ์ด๋ : ํด๋ผ์ด์ธํธ โ ์๋ฒ
- ์์๋ฐ์ด๋ : ์๋ฒ โ ํด๋ผ์ด์ธํธ
- ๋ค์ด์คํธ๋ฆผ์ผ๋ก ํ๋ฅด๋ ๋ฉ์์ง
- ์์ฒญ ๋ฉ์์ง๋ ์๋ต ๋ฉ์์ง๋์ ๊ด๊ณ ์์ด ๋ชจ๋ ๋ฉ์์ง๋ ๋ค์ด์คํธ๋ฆผ์ผ๋ก ํ๋ฆ
- ์
์คํธ๋ฆผ : ์์ ์์ ์
์คํธ๋ฆผ์ ๋ฐ์ก์
- ๋ค์ด์คํธ๋ฆผ : ๋ฐ์ก์์ ๋ค์ด์คํธ๋ฆผ์ ์์ ์
- ๋ฉ์์ง๋ ๋ฐ์ก์ โ ์์ ์๋ก ์ด๋ํ๋ฏ๋ก ๋ฌด์กฐ๊ฑด ๋ค์ด์คํธ๋ฆผ์ผ๋ก ํ๋ฆ
๋ฉ์์ง์ ๊ฐ ๋ถ๋ถ
HTTP ๋ฉ์ธ์ง์ ์ธ ๋ถ๋ถ
- ์์์ค (start line)
- ํค๋ (HTTP headers + empty line(CRLF))
- ๋ณธ๋ฌธ (body)
๋ฉ์์ง ๋ฌธ๋ฒ
์์ฒญ ๋ฉ์์ง (Request)
<๋ฉ์๋> <์์ฒญ URL> <๋ฒ์ >
<ํค๋>
_๋น_์ค_
<์ํฐํฐ ๋ณธ๋ฌธ>
- ๋ฉ์๋(Method) : ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ฒ๊ฐ ๋ฆฌ์์ค์ ๋ํด ์ํํด์ฃผ๊ธธ ๋ฐ๋ผ๋ ๋์
- GET, POST, PUT, DELETE ๋ฑ...
- ์์ฒญ URL(Request URL) : ์์ฒญ ๋์์ด ๋๋ ๋ฆฌ์์ค๋ฅผ ์ง์นญํ๋ ์์ ํ URL ๋๋ URL์ ๊ฒฝ๋ก ๊ตฌ์ฑ์์
- ๋ฒ์ (Version) : ๋ฉ์์ง์์ ์ฌ์ฉ ์ค์ธ HTTP ๋ฒ์
์๋ต ๋ฉ์์ง (Response)
<๋ฒ์ > <์ํ ์ฝ๋> <์ฌ์ ๊ตฌ์ >
<ํค๋>
_๋น_์ค_
<์ํฐํฐ ๋ณธ๋ฌธ>
- ์ํ ์ฝ๋(Status Code) : ์์ฒญ ์ค์ ๋ฌด์์ด ์ผ์ด๋ฌ๋์ง ์ค๋ช
ํ๋ ์ธ ์๋ฆฌ ์ซ์
- 200, 204, 301, 304, 401, 404, 500 ๋ฑ...
- ์ฌ์ ๊ตฌ์ (Reason Phrase) : ์ซ์๋ก ๋ ์ํ ์ฝ๋์ ์๋ฏธ๋ฅผ ์ฌ๋์ด ์ดํดํ ์ ์๊ฒ ์ค๋ช
ํด์ฃผ๋ ์งง์ ๋ฌธ๊ตฌ
- 200 OK, 204 No Contents ๋ฑ...
- ํค๋๋ค(Headers) :
์ด๋ฆ:๊ฐ
์ผ๋ก ๊ตฌ์ฑ ๋ ํค๋ ๋ชฉ๋ก. ๋ง์ง๋ง ์ค์ ๋น ์ค๋ก ๋๋จ
- Content-type: text/plain, Content-length: 19 ๋ฑ...
- ์ํฐํฐ ๋ณธ๋ฌธ (Body) : ์ํฐํฐ ๋ณธ๋ฌธ์ ์์์ ๋ฐ์ดํฐ ๋ธ๋ก์ ํฌํจ.
- ์ํฐํฐ ๋ณธ๋ฌธ ์์ด ๋น ์ค๋ก ๋๋๋ ๋ฉ์์ง๋ ์์
๋ฉ์๋
์์ ํ ๋ฉ์๋
- GET, HEAD๊ฐ ์์ ํ ๋ฉ์๋
- GET, HEAD ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ HTTP ์์ฒญ์ ๊ฒฐ๊ณผ๋ก ์๋ฒ์ ์ด๋ค ์์ฉ๋ ์์์ ์๋ฏธ
- ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ๊ณ ์๊ฐํ๋ฉฐ ์ดํด๊ฐ ์ฌ์ธ ๋ฏ
GET
- ์๋ฒ์๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ฌ๋ผ๊ณ ์์ฒญํ๊ธฐ ์ํด ์ฌ์ฉ
HEAD
- GET๊ณผ ๋น์ทํ์ง๋ง, ์๋ฒ๋ ์๋ต์ผ๋ก ํค๋๋ง ๋๋ ค ์ค
- ์ฉ๋
- ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ๋ ๋ฌด์์ธ์ง(ํ์
, ๊ธธ์ด ๋ฑ...) ์์ ๋ผ ์ ์์
- ์๋ต์ ์ํ ์ฝ๋๋ฅผ ํตํด, ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ํ์ธ ๊ฐ๋ฅ
- ํค๋๋ฅผ ํ์ธํ์ฌ ๋ฆฌ์์ค์ ๋ณ๊ฒฝ ์ฌ๋ถ ๊ฒ์ฌ
PUT
- ์๋ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ๊ฐฑ์ ํ๊ธฐ ์ํด ์ฌ์ฉ. Body ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ฌ์ฉ
POST
- ์๋ฒ์ ์๋ก์ด ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ. Body์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ฌ์ฉ
DELETE
- ์๋ฒ์ ์๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
์ํ ์ฝ๋
100-199: ์ ๋ณด์ฑ ์ํ ์ฝ๋
- 100 Continue
: ์์ฒญ์ ์์ ๋ถ๋ถ์ด ์ผ๋ถ๊ฐ ๋ฐ์ ๋ค์ฌ ์ก์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ๋๋จธ์ง๋ฅผ ๊ณ์ ์ด์ด์ ๋ณด๋ด์ผ ํจ์ ์๋ฏธ
- 101 Switching Protocols
: ํด๋ผ์ด์ธํธ๊ฐ Upgrade ํค๋์ ๋์ดํ ๊ฒ ์ค ํ๋๋ก ์๋ฒ๊ฐ ํ๋กํ ์ฝ์ ๋ฐ๊พธ์์์ ์๋ฏธ
200-299 : ์ฑ๊ณต ์ํ ์ฝ๋
- 200 OK
: ์์ฒญ์ ์ ์์ด๊ณ , ์ํฐํฐ ๋ณธ๋ฌธ์ ์์ฒญ๋ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๊ณ ์์
- 201 Created
: ์๋ฒ ๋ฆฌ์์ค๋ฅผ ์์ฑ ์์ฒญ(์: POST)์ ๋ํ ์๋ต
- 202 Accepted
: ์์ฒญ์ ๋ฐ์ ๋ค์ฌ์ก์ผ๋ ์๋ฒ๋ ์์ง ๊ทธ์ ๋ํ ์ด๋ค ๋์๋ ์ํํ์ง ์์์
- 203 Non-Authoritative Information
- 204 No Content
- ์๋ต ๋ฉ์์ง๋ ํค๋์ ์ํ์ค์ ํฌํจํ์ง๋ง ์ํฐํฐ ๋ณธ๋ฌธ์ ํฌํจํ์ง ์์
- DELETE์ ๊ฐ์ด ์คํ ํ ๋ฐํ ํ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ
- GET ์์ฒญ ์ ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ 200๊ณผ ํจ๊ป ๋น ๊ฐ์ ๋ฐํ
- 205 Reset Content
- 206 Partial Content
300-399 : ๋ฆฌ๋ค์ด๋ ์
์ํ ์ฝ๋
- 300 Multiple Choices
: ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ๊ฐ๋ฆฌํค๋ URL์ ์์ฒญํ ๊ฒฝ์ฐ, ๊ทธ ๋ฆฌ์์ค์ ๋ชฉ๋ก๊ณผ ํจ๊ป ๋ฐํ
- 301 Moved Permanently
: ์์ฒญํ URL์ด ์ฎ๊ฒจ์ก์ ๋ ์ฌ์ฉ
- 302 Found
- 303 See Other
- 304 Not Modified
: GET๊ณผ ํจ๊ป ์์ ์ผ์ ๋ํ ์กฐ๊ฑด๋ถ ํค๋๋ฅผ ๋ณด๋ธ ๊ฒฝ์ฐ. ์์ ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ
- 305 Use Proxy
- 307 Temporary Redirect
400-499 : ํด๋ผ์ด์ธํธ ์๋ฌ ์ํ ์ฝ๋
- 400 Bad Request
: ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป ๋ ์์ฒญ์ ๋ณด๋๋ค๊ณ ๋งํด์ค
- 401 Unauthorized
: ์ธ์ฆ์ด ํ์ํ๋ค๊ณ ์๋ ค์ค
- 402 Payment Required
- 403 Forbidden
: ์์ฒญ์ด ์๋ฒ์ ์ํด ๊ฑฐ๋ถ ๋์์์ ์๋ ค์ค. ๊ฑฐ๋ถ ๋ ์ด์ ๋ ๋ณธ๋ฌธ์ ํฌํจ์ํฌ ์ ์์
- 404 Not Found
: ์๋ฒ๊ฐ ์์ฒญํ URL
- 404 Not Found
: ์๋ฒ๊ฐ ์์ฒญํ URL์ ์ฐพ์ ์ ์์ ๋ ์ฌ์ฉ
- 405 Method Not Allowed
: ์์ฒญํ URL์ ๋ํด, ์ง์ํ์ง ์๋ ๋ฉ์๋๋ก ์์ฒญ ๋ฐ์์ ๋ ์ฌ์ฉ
- 406 Not Acceptable
- 407 Proxy Authentication Required
- 408 Request Timeout
: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์์ํ๊ธฐ์ ์๊ฐ์ด ๋๋ฌด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ์ด ์ํ ์ฝ๋๋ก ์๋ตํ๊ณ ์ฐ๊ฒฐ์ ๋์ ์ ์์
- 409 Conflict
- 410 Gone
- 411 Length Required
- 412 Precondition Failed
- 413 Request Entity Too Large
- 414 Request URI Too Long
- 415 Unsupported Media Type
- 415 Requested Range Not Satisfiable
- 417 Expectation Failed
- 422 Unprocessable Entity
: ํด์ ๊ฐ๋ฅํ Content-Type์ ์ํฐํฐ์ด์ง๋ง, ๋ฐ์ดํฐ ํ๋ ๋ฑ์ด ์ ํจํ์ง ์์ ๊ฒฝ์ฐ (ํ์ง๋ง ํ์ค์ ์๋)
500-599 : ์๋ฒ ์๋ฌ ์ํ ์ฝ๋
- 500 Internal Server Error
: ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ง๋๋ ์๋ฌ๋ ๋ง๋ฌ์ ๋ ์ฌ์ฉ
- 501 Not Implemented
- 502 Bad Gateway
: Gateway๋ก ๋ถํฐ ์ฌ๋ฐ๋ฅธ ์๋ต์ ๋ฐ์ง ๋ชปํ์ ๋ ์ฌ์ฉ
- 503 Service Unavailable
: ํ์ฌ๋ ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํด ์ค ์ ์์ง๋ง ๋์ค์๋ ๊ฐ๋ฅํจ์ ์๋ฏธ
- 504 Gateway Timeout
: ๋ค๋ฅธ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ํ์์์์ด ๋ฐ์ํ Gateway๋ Proxy์์ ์จ ์๋ต
- 505 HTTP Version Not Supported
: ์๋ฒ๊ฐ ์ง์ํ ์ ์๊ฑฐ๋ ์ง์ํ์ง ์์ผ๋ ค๊ณ ํ๋ ๋ฒ์ ์ ํ๋กํ ์ฝ๋ก ๋ ์์ฒญ์ ๋ฐ์์ ๋
HTTP StatusCode Decision Diagram
- ์ด๋ค ์ํฉ์์ ์ด๋ค ์ํ ์ฝ๋๊ฐ ์๋ต์ผ๋ก ๋ณด๋ด๋์ง ์๊ฐํ ํ ์๋ฃ
[์ถ์ฒ : https://github.com/for-GET/http-decision-diagram]
ํค๋
์ผ๋ฐ ํค๋
- Date : ๋ฉ์์ง๊ฐ ์ธ์ ๋ง๋ค์ด ์ก๋์ง์ ๋ํ ๋ ์ง์ ์๊ฐ์ ์ ๊ณต
- Upgrade : ๋ฐ์ก์๊ฐ '์
๊ทธ๋ ์ด๋'ํ๊ธธ ์ํ๋ ์ ๋ฒ์ ์ด๋ ํ๋กํ ์ฝ์ ์๋ ค์ค
- Via : ์ด ๋ฉ์์ง๊ฐ ์ด๋ค ์ค๊ฐ์(Proxy, Gateway)๋ฅผ ๊ฑฐ์ณ ์๋์ง ๋ณด์ฌ์ค
์์ฒญ ํค๋
- Host : ์์ฒญ์ ๋์์ด ๋๋ ์๋ฒ์ ํธ์คํธ ๋ช
๊ณผ ํฌํธ
- Referer : ํ์ฌ์ ์์ฒญ URL์ด ๋ค์ด์์๋ ๋ฌธ์์ URL
- User-Agent : ์์ฒญ์ ๋ณด๋ธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฆ
Accept ๊ด๋ จ ์์ฒญ ํค๋
- Accept : ์๋ฒ๊ฐ ๋ณด๋ด๋ ๋๋ ๋ฏธ๋์ด ์ข
๋ฅ
- Accept-Charset : ์๋ฒ๊ฐ ๋ณด๋ด๋ ๋๋ ๋ฌธ์ ์งํฉ
- Accept-Encoding : ์๋ฒ๊ฐ ๋ณด๋ด๋ ๋๋ ์ธ์ฝ๋ฉ
- Aceept-Language : ์๋ฒ๊ฐ ๋ณด๋ด๋ ๋๋ ์ธ์ด
์กฐ๊ฑด๋ถ ์์ฒญ ํค๋
- Expect : ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ํ์ํ ์๋ฒ์ ํ๋์ ์ด๊ฑฐํ ์ ์๊ฒ ํด์ค
- If-Match : ๋ฌธ์์ ์ํฐํฐ ํ๊ทธ๊ฐ ์ฃผ์ด์ง ์ํฐํฐ ํ๊ทธ์ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ด
- If-None-Match : ๋ฌธ์์ ์ํฐํฐ ํ๊ทธ๊ฐ ์ฃผ์ด์ง ์ํฐํฐ ํ๊ทธ์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ด
- If-Modified-Since : ์ฃผ์ด์ง ๋ ์ง ์ดํ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ด
- If-Unmodified-Since : ์ฃผ์ด์ง ๋ ์ง ์ดํ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ์๋ง ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ด
- If-Range : ๋ฌธ์์ ํน์ ๋ฒ์์ ๋ํ ์์ฒญ์ ํ ์ ์๊ฒ ํด์ค
- Range : ์๋ฒ๊ฐ ๋ฒ์ ์์ฒญ์ ์ง์ํ๋ค๋ฉด, ๋ฆฌ์์ค์ ๋ํ ํน์ ๋ฒ์๋ฅผ ์์ฒญ
์์ฒญ ๋ณด์ ํค๋
- Authorization : ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์ ๊ณตํ๋ ์ธ์ฆ ๊ทธ ์์ฒด์ ๋ํ ์ ๋ณด (์: JWT Token, OAuth Token ๋ฑ)
- Cookie : ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ํ ํฐ์ ์ ๋ฌํ ๋ ์ฌ์ฉ
- Cookie2 : ์์ฒญ์๊ฐ ์ง์ํ๋ ์ฟ ํค์ ๋ฒ์ ์ ์๋ ค์ค ๋ ์ฌ์ฉ
์๋ต ํค๋
- Age : ์๋ต์ด ์ผ๋ง๋ ์ค๋ ๋์๋์ง
- Public : ์๋ฒ๊ฐ ํน์ ๋ฆฌ์์ค์ ๋ํด ์ง์ํ๋ ์์ฒญ ๋ฉ์๋์ ๋ชฉ๋ก
- Retry-After : ํ์ฌ ๋ฆฌ์์ค๊ฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ์ํ์ผ ๋, ์ธ์ ๊ฐ๋ฅํด์ง๋์ง ๋ ์ง ํน์ ์๊ฐ
- Server : ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ๊ณผ ๋ฒ์
- Title : HTML ๋ฌธ์์์ ์ฃผ์ด์ง ๊ฒ๊ณผ ๊ฐ์ ์ ๋ชฉ
- Warning : ์ฌ์ ๊ตฌ์ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ์์ธํ ๊ฒฝ๊ณ ๋ฉ์ธ์ง
ํ์ ํค๋
- Accept-Ranges : ์๋ฒ๊ฐ ์์์ ๋ํด ๋ฐ์๋ค์ผ ์ ์๋ ๋ฒ์์ ํํ
- Vary : ์๋ฒ๊ฐ ํ์ธํด ๋ณด์์ผ ํ๊ณ ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ต์ ์ํฅ์ ์ค ์ ์๋ ํค๋๋ค์ ๋ชฉ๋ก. ์) ๊ถํ ๊ด๋ฆฌ๋ฅผ ์ํ Access-Control-Request-Method, Access-Control-Request-Headers, Origin
์๋ต ๋ณด์ ํค๋
- Proxy-Authenticate : Proxy์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ธ ์ธ์ฆ์๊ตฌ์ ๋ชฉ๋ก
- Set-Cookie : ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ ์ ์๋๋ก ํด๋ผ์ด์ธํธ ์ธก์ ํ ํฐ์ ์ค์ ํ๊ธฐ ์ํด ์ฌ์ฉ
- WWW-Authenticate : ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ธ ์ธ์ฆ์๊ตฌ ๋ชฉ๋ก
์ํฐํฐ ํค๋
- Allow : ์ด ์ํฐํฐ์ ๋ํด ์ํ๋ ์ ์๋ ์์ฒญ ๋ฉ์๋ ๋ชฉ๋ก
- Location : ํด๋ผ์ด์ธํธ์๊ฒ ์ํฐํฐ๊ฐ ์ด๋์ ์์นํ๊ณ ์๋์ง ์๋ ค์ค
์ฝํ
์ธ ํค๋
- Content-Base : ๋ณธ๋ฌธ์์ ์ฌ์ฉ ๋ ์๋ URL์ ๊ณ์ฐํ๊ธฐ ์ํ Base URL
- Content-Encoding : ๋ณธ๋ฌธ์ ์ ์ฉ ๋ ์ธ์ฝ๋ฉ
- Content-Language : ๋ณธ๋ฌธ์ ์ดํดํ๊ธฐ ์ํ ์ธ์ด
- Content-Length : ๋ณธ๋ฌธ์ ๊ธธ์ด๋ ํฌ๊ธฐ
- Content-Location : ๋ฆฌ์์ค์ ์ค์ ์์น
- Content-MD5 : ๋ณธ๋ฌธ์ MD5 ์ฒดํฌ์ฌ
- Content-Range : ์ ์ฒด ๋ฆฌ์์ค์์ ์ด ์ํฐํฐ๊ฐ ํด๋นํ๋ ๋ฒ์๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ํํ
- Content-Type : ๋ณธ๋ฌธ์ ๊ฐ์ฒด ์ข
๋ฅ
์ํฐํฐ ์บ์ฑ ํค๋
- ETag : ์ํฐํฐ์ ๋ํ ์ํฐํฐ ํ๊ทธ (AWS S3์์ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์)
- Expires : ์ํฐํฐ์ ๋ง๋ฃ ์ผ์
- Last-Modified : ๊ฐ์ฅ ์ต๊ทผ ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ผ์