๐ ์ค๋์ ํ์ต ํค์๋
HTTP, REST
๐ HTTP
HTTP(Hypertext Transfer Protocol)๋ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ
์ ํ๋ฆฌ์ผ์ด์
๋ ์ด์ด ํ๋กํ ์ฝ์
๋๋ค. HTTP๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ
์๋ฒ์ ์์ฒญ(request)์ ๋ณด๋ด๋ฉด ์๋ฒ๋ ๊ทธ์ ๋ํ ์๋ต(response)์ ์ ๊ณตํฉ๋๋ค.
๐ HTTP์ ํต์ ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ URL์ ์
๋ ฅํ๊ฑฐ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋
๋๋ค.
- ์๋ฒ๋ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํฉ๋๋ค.
- ์๋ฒ๋ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ต์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ถ๊ฐ ์์ฒญ์ ๋ณด๋
๋๋ค.
๐ HTTP ์ฃผ์ ํน์ง
๋ฌด์ํ(Stateless)
- HTTP๋ ๊ฐ ์์ฒญ-์๋ต ์์ด ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ด์ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ์ง์์
- ์๋ฒ๋ ๊ฐ ์์ฒญ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ์์ฒญ ๊ฐ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ ์งํ์ง ์์
- ์ด๋ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๊ณ ํ์ฅ์ฑ์ ๋์ผ ์ ์์ง๋ง, ํ์ํ ๊ฒฝ์ฐ ์ฟ ํค๋ ์ธ์
์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ๋ ์์
๋ฉ์๋(Method)
ํด๋ผ์ด์ธํธ๊ฐ ์น์๋ฒ์๊ฒ ์์ฒญํ๋ ๋ชฉ์ ๋ฐ ๊ทธ ์ข
๋ฅ๋ฅผ ์๋ฆฌ๋ ์๋จ์ ๋งํ๋ค.
- GET:
- ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญ
- URL(URI) ํ์์ผ๋ก ์๋ฒ ์ธก์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํจ
- HEAD:
- GET์์ฒญ๊ณผ ์ ์ฌํ์ง๋ง, ์๋ต ๋ณธ๋ฌธ์ ๋ฐ์ง ์๊ณ ํค๋ ์ ๋ณด๋ง ์์ฒญ
- POST:
- ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ์ฌ ์ฒ๋ฆฌ๋ฅผ ์์ฒญ
- ์ฃผ๋ก ํผ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋จ
- PUT:
- ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ์
๋ฐ์ดํธ
- ๋ฆฌ์์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก ์์ฑํ ์๋ ์์
- DELETE:
- ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์
- ์น ์๋ฒ์ธก์ ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ๋ ์ฌ์ฉ
- ์ค์ ๋ก ํด๋ผ์ด์ธํธ์์ ์๋ฒ ์์์ ์ญ์ ํ๋๋ก ํ์ง ์์์ ๋นํ์ฑํ๋ก ๊ตฌ์ฑ
- CONNECT:
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ค๊ฐ ๊ฒฝ์ ๋ฅผ ์ํจ
- ๋ณดํต Proxy๋ฅผ ํตํด SSL ํต์ ์ ํ๊ณ ์ํ ๋ ์ฌ์ฉ
- OPTIONS:
- ์๋ฒ ์ธก ์ ๊ณต ๋ฉ์๋์ ๋ํด ์ง์๋ฅผ ํ๊ธฐ ์ํจ
- ์น ์๋ฒ ์ธก์์ ์งํ๊ณ ์๋ ๋ฉ์๋๊ฐ ๋ฌด์์ธ์ง ์๊ธฐ ์ํด ์ฌ์ฉํ๋ค
- TRACE:
- Request ๋ฆฌ์์ค๊ฐ ์์ ๋๋ ๊ฒฝ๋ก๋ฅผ ๋ณด๊ธฐ ์ํจ
- ์น ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ด์ฉ์ ํ์ธํ๊ธฐ ์ํด loop-back ํ
์คํธ๋ฅผ ํ ๋ ์ฌ์ฉ
- PATCH:
- ๋ฆฌ์์ค(๋ฐ์ดํฐ)์ ์ผ๋ถ๋ถ๋ง ๊ฐฑ์ ํ๊ธฐ ์ํจ
- PUT๊ณผ ์ ์ฌํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ์ด ์๋ ๋ฆฌ์์ค์ ์ผ๋ถ๋ถ๋ง ์์ ํ ๋ ์ฐ์
- HTTP ์์ฒญ๊ณผ ์๋ต์๋ ํค๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ด๋ ์์ฒญ ๋๋ ์๋ต์ ๋ํ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํจ
- ํค๋๋ ํค-๊ฐ ์ ํํ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฝ๋ก (:)์ผ๋ก ๊ตฌ๋ถ๋จ
- ์์ฒญ ํค๋์ ์์:User-Agent(ํด๋ผ์ด์ธํธ ์ ๋ณด), Accept(ํด๋ผ์ด์ธํธ๊ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅํ MIMEํ์
), Cookie(ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ์ฟ ํค ์ ๋ณด) ๋ฑ
- ์๋ต ํค๋์ ์์: Content-Type(์๋ต ๋ฐ์ดํฐ์ MIME ํ์
), Set-Cookie(ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ฅผ ์ค์ ), Cache-Control(์บ์ ์ ์ด ์ต์
) ๋ฑ
์ํ ์ฝ๋(Status Code)
HTTP ์๋ต์๋ ์ํ ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ด๋ ์์ฒญ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋
๋๋ค.
์ํ ์ฝ๋๋ ์ธ ์๋ฆฌ ์ซ์๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฒซ๋ฒ์งธ ์๋ฆฌ๋ ์๋ต์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค.
- 1xx(์ ๋ณด): ์์ฒญ์ด ์์ ๋์์ผ๋ฉฐ ์ฒ๋ฆฌ๊ฐ ๊ณ์ ์งํ ์ค์์ ๋ํ๋
- 2xx(์ฑ๊ณต): ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์์ ๋ํ๋ (์: 200 OK)
- 3xx(๋ฆฌ๋ค์ด๋ ์
): ์์ฒญ์ ์๋ฃํ๊ธฐ ์ํด ์ถ๊ฐ ๋์์ด ํ์ํจ
- 4xx(ํด๋ผ์ด์ธํธ ์ค๋ฅ): ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ค๋ฅ๊ฐ ์์์ ๋ํ๋
- 5xx(์๋ฒ ์ค๋ฅ): ์๋ฒ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๋ํ๋
200๋ฒ๋ : ํต์ ์ฑ๊ณต
์ํ์ฝ๋ | ์ด๋ฆ | ์๋ฏธ |
---|
200 | OK | ์์ฒญ ์ฑ๊ณต(GET) |
201 | Create | ์์ฑ ์ฑ๊ณต(POST) |
202 | Accepted | ์์ฒญ ์ ์ O, ๋ฆฌ์์ค ์ฒ๋ฆฌ X |
204 | No Contents | ์์ฒญ ์ฑ๊ณต O, ๋ด์ฉ ์์ |
300๋ฒ๋ : ๋ฆฌ๋ค์ด๋ ํธ
์ํ์ฝ๋ | ์ด๋ฆ | ์๋ฏธ |
---|
300 | Multiple Choice | ์์ฒญ URI์ ์ฌ๋ฌ ๋ฆฌ์์ค๊ฐ ์กด์ฌ |
301 | Move Permanently | ์์ฒญ URI๊ฐ ์ ์์น๋ก ์ฎ๊ฒจ๊ฐ |
304 | Not Modified | ์์ฒญ URI์ ๋ด์ฉ์ด ๋ณ๊ฒฝ X |
400๋ฒ๋ : ํด๋ผ์ด์ธํธ ์ค๋ฅ
์ํ์ฝ๋ | ์ด๋ฆ | ์๋ฏธ |
---|
400 | Bad Request | API์์ ์ ์๋์ง ์์ ์์ฒญ ๋ค์ด์ด |
401 | Unauthorized | ์ธ์ฆ ์ค๋ฅ |
403 | Forbidden | ๊ถํ ๋ฐ์ ์ ๊ทผ ์๋ |
404 | Not Found | ์์ฒญ URI์ ๋ํ ๋ฆฌ์์ค ์กด์ฌ X |
405 | Method Not Allowed | API์์ ์ ์๋์ง ์์ ๋ฉ์๋ ํธ์ถ |
406 | Not Acceptable | ์ฒ๋ฆฌ ๋ถ๊ฐ |
408 | Request Timeout | ์์ฒญ ๋๊ธฐ ์๊ฐ ์ด๊ณผ |
409 | Conflict | ๋ชจ์ |
429 | Too Many Request | ์์ฒญ ํ์ ์ํ ์ด๊ณผ |
500๋ฒ๋ : ์๋ฒ ์ค๋ฅ
์ํ์ฝ๋ | ์ด๋ฆ | ์๋ฏธ |
---|
500 | Internal Server Error | ์๋ฒ ๋ด๋ถ ์ค๋ฅ |
502 | Bad Gateway | ๊ฒ์ดํธ์จ์ด ์ค๋ฅ |
503 | Service Unavailable | ์๋น์ค ์ด์ฉ ๋ถ๊ฐ |
504 | Gateway Timeout | ๊ฒ์ดํธ์จ์ด ์๊ฐ ์ด๊ณผ |
๋ณด์
- HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ฌธ ํต์ ์ ์ฌ์ฉํ๋ฏ๋ก ๋ณด์์ ์ทจ์ฝํจ
- HTTPS(HTTP Secure)๋ SSL/TLS๋ฅผ ์ฌ์ฉํ์ฌ ํต์ ์ ์ํธํํจ์ผ๋ก์จ ๋ณด์์ ๊ฐํํจ
- HTTPS๋ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ฑ, ๋ฌด๊ฒฐ์ฑ, ์ธ์ฆ์ ์ ๊ณตํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ(MITM)์ ๋ฐฉ์งํจ
- HTTPS๋ ์น ์ฌ์ดํธ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ ์์ ๊ฒ์ฆํ๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ์ํธํํจ
๐งฉ REST
REST(REpresentational State Transfer)๋ ๋ถ์ฐ ํ์ดํผ ๋ฏธ๋์ด ์์คํ
์ ์ํ ์ํํธ ์ํคํ
์ณ ์คํ์ผ์
๋๋ค.
REST๋ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ
์ณ๋ก, ๋คํธ์ํฌ ์์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ํต์ ๋ฐฉ์์
์ ์ ํฉ๋๋ค.
REST๋ ๋ชจ๋ ๊ฒ์ ์์(Resource)๋ก ์ทจ๊ธํ๋ฉฐ, ๊ฐ ์์์ ๊ณ ์ ํ ์๋ณ์(URI)๋ฅผ ๊ฐ์ง๋๋ค. ํด๋ผ์ด์ธํธ๋ HTTP ๋ฉ์๋(GET, POST, PUT, DELETE ๋ฑ)๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ํ CRUD(Create, Read, Update, Delete) ์์
์ ์ํํฉ๋๋ค.
๐งฉ REST์ ์ฃผ์ ํน์ง
- ํด๋ผ์ด์ธํธ-์๋ฒ ๊ตฌ์กฐ: REST๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ญํ ์ ๋ช
ํํ ๋ถ๋ฆฌ
- ๋ฌด์ํ(Stateless): REST๋ ํด๋ผ์ด์ธํธ์ Context๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง์์. ๊ฐ ์์ฒญ์ ํ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ํฌํจํด์ผ ํ๋ฉฐ, ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ธฐ์ตํ ํ์๊ฐ ์์
- ์บ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ: REST๋ ํด๋ผ์ด์ธํธ๋ ์ค๊ฐ ์๋ฒ์์ ์บ์ํ ์ ์๋๋ก ํจ. ๋คํธ์ํฌ ํจ์จ์ฑ์ ๋์ด๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต ์๊ฐ์ ์ค์ผ ์ ์์
- ๊ณ์ธตํ(Layered System): REST๋ ํด๋ผ์ด์ธํธ-์๋ฒ ์ฌ์ด์ ๊ฒ์ดํธ์จ์ด, ํ๋ก์, ๋ก๋ ๋ฐธ๋ฐ์ ๋ฑ์ ์ค๊ฐ ์๋ฒ๋ฅผ ๋ ์ ์์. ์ด๋ฅผ ํตํด ์์คํ
์ ํ์ฅ์ฑ๊ณผ ๋ณด์์ฑ์ ๋์ผ ์์์
- ์ธํฐํ์ด์ค ์ผ๊ด์ฑ: REST๋ ์์, HTTP ๋ฉ์๋, ์์ฒด ์ค๋ช
์ ๋ฉ์์ง ๋ฑ์ ํตํด ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณต
- Code on demand: ์๋ฒ์์ ์ํํธ์จ์ด ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์กํด์ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ ์ผ์์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅ
๐งฉ REST์ ์ฅ๋จ์
์ฅ์
- HTTP ํ๋กํ ์ฝ ํ์ฉ: ์บ์ฑ, ๋ณด์, ์์ถ ๋ฑ์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ด ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ๊ฐ์ ธ๊ฐ ์ ์์
- ํ๋ซํผ ๋
๋ฆฝ์ฑ: HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ฏ๋ก, ๋ค์ํ ํ๋ซํผ๊ณผ ์ธ์ด์์ REST API๋ฅผ ์ฌ์ฉํ ์ ์์
- ๋ฉ์์ง์ ๋ช
ํ์ฑ: REST๋ HTTP ๋ฉ์๋, URI, ๋ฏธ๋์ด ํ์
๋ฑ์ ํตํด API์ ์๋๋ฅผ ๋ช
ํํ๊ฒ ์ ๋ฌ
- ํด๋ผ์ด์ธํธ-์๋ฒ ์ญํ ๋ถ๋ฆฌ: ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ์ฌ์ฉ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๋ฒ๋ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌ
๋จ์
- ํ์ค์ ๋ถ์ฌ: REST๋ ์ํคํ
์ณ ์คํ์ผ์ด๋ฏ๋ก ๊ตฌ์ฒด์ ์ธ ๊ตฌํ ํ์ค์ด ์กด์ฌํ์ง ์์
- ์ํ ๊ด๋ฆฌ์ ์ด๋ ค์: REST๋ ๋ฌด์ํ ํต์ ์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ฏ๋ก, ํด๋ผ์ด์ธํธ์ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ตฌํ์ด ๋ณต์กํด์ง ์ ์์
- ์ค๋ฒํค๋: REST๋ ๊ฐ ์์ฒญ๋ง๋ค ํ์ํ ์ ๋ณด๋ฅผ ํฌํจํด์ผ ํ๋ฏ๋ก ๋ฉ์์ง ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์์ง๋ง ํ๋กํ ์ฝ์ ์์ถ์ด๋ ํ์ด์ง ๋ฑ์ ๊ธฐ๋ฒ์ผ๋ก ์ํ ๊ฐ๋ฅ
- ์ค์๊ฐ ํต์ ์ ์ ์ฝ: REST๋ ์์ฒญ-์๋ต ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์๋ ์ ํฉํ์ง ์์ ์ ์์
๐ ์ค๋์ ํ๊ณ
์์ผ๋ก ๊ธฐ์ ๋ฉด์ ์ค๋น๋ ํด์ผํ๋๋ฐ ์ค์ํ ์๊ฐ์ ๊ตฌํ ๋จผ์ ํ๋ฉด ์ต์ํด์ง๊ฒ ์ง๋ผ๋ ์์ผํ ๋ง์์ผ๋ก ์ ๋๋ก ๋ณด์ง์์๋ ๊ฒ๋ค์ด ๋ง์ต๋๋ค. ์ง๋์ณค๋ ๊ฒ๋ค์ ๋ง์ด ๋๋์๋ณด๋ฉฐ ์ ๋ฆฌํ๋ ์๊ฐ์ ๊ฐ์ ธ์ผ๊ฒ ์ต๋๋ค.