π
λ μ§: 2026λ
4μ 11μΌ
RESTμ λν΄
π‘REST λ?
μΉμ μ₯μ μ μ΅λν νμ©νκΈ° μν΄ λ§λ€μ΄μ§ μν€ν
μ² μ€νμΌμ΄λ€.
볡μ‘νκ² λ€λ¦΄ μ μμ§λ§, ν΅μ¬μ μμ(Data)μ μ΄λ»κ² μ΄λ¦ λΆμ΄κ³ (URL), μ΄λ»κ² μ²λ¦¬ν μ§(HTTP Method)μ λν μ½μμ΄λ€.
RESTμ ν΅μ¬ κ°λ
| κ΅¬λΆ | λ΄μ© | λΉμ |
|---|
| μμ(Resource) | μ°λ¦¬κ° μ»κ³ μ νλ λ°μ΄ν°(μ : μ¬μ©μ μ 보, κ²μλ¬Ό, μν, μ₯λ°κ΅¬λ, κ²°μ μλ¨ λ±) | λ©λ΄νμ μλ μμ |
| νμ(Verb) | λ°μ΄ν°μ λν΄ λ¬΄μμ ν κ²μΈκ°(HTTP λ©μλ μ¬μ©) | μ£Όλ¬Έ λ°©μ (μ£Όλ¬ΈνκΈ°, μ·¨μνκΈ° λ±) |
| νν (Representation) | λ°μ΄ν°λ₯Ό μ΄λ€ νμμΌλ‘ 보μ¬μ€ κ²μΈκ°(JSON, XML λ±) | μμμ΄ λ΄κ²¨ λμ€λ κ·Έλ¦ |
- μμ : μΌν μμ β μν, μ₯λ°κ΅¬λ, κ²°μ μλ¨
- URL β
/items, /carts. /payments β Aμλ²μ£Όμ/items β Aμλ²κ° κ΄λ¦¬νλ μν(items)μ URLλ‘ μ κ·Ό!!
- νμ : HTTP λ©μλ
- GET : μ‘°ν(Read)
- POST : μμ±(Create)
- PUT/PATCH : μμ (Update)
- DELETE : μμ (Delete)
- νν : JSON νμ ? OR XMLνμ ? β μ΄λ€ νμμ μ¬μ©ν κ±°λ?
REST μ€κ³μμΉ 6κ°μ§
- κ· μΌν μΈν°νμ΄μ€(Uniforn Interface)
- URL, HTTP λ±μ νμ€νλ λ°©λ²μ μ¬μ©νλ€.
- HTTP νμ€λ§ λ°λ₯Έλ€λ©΄ μ΄λ€ μΈμ΄λ νλ«νΌμμλ μ¬μ©ν μ μλ 곡ν΅λ μΈν°νμ΄μ€λ₯Ό κ°μ ΈμΌ νλ€.
- 무μν(Stateless)
- μλ²λ ν΄λΌμ΄μΈνΈμ μνλ₯Ό μ μ₯νμ§ μλλ€. κ° μμ²μ λ
립μ μ΄λ©° νμν λͺ¨λ μ 보λ₯Ό ν¬ν¨ν΄μΌ νλ€.
- ν΄λΌμ΄μΈνΈ - μλ² λΆλ¦¬(Client-Server Architecture)
- ν΄λΌμ΄μΈνΈκ° UIλ₯Ό μ²λ¦¬νλ€.
- μλ²λ λ°μ΄ν° μ μ₯, 보μ, μν¬λ‘λλ₯Ό λ΄λΉνλ€.
- ν΄λΌμ΄μΈνΈμ μλ²λ λͺ
νν ꡬλΆλμ΄μΌ νλ€.
- κ³μΈ΅ν μμ€ν
(Layered System)
- ν΄λΌμ΄μΈνΈλ μλ²μ μ§μ ν΅μ νμ§ μκ³ μ€κ° κ³μΈ΅μ κ±°μΉλ€.
- ν΅μ λμμ΄ μ΅μ’
μλ²μΈμ§ μ€κ°μ(보μ, λ‘λ λ°Έλ°μ± λ±)μΈμ§ μ μ μλλ‘ μ€κ³ν΄μΌ νλ€.
- μλ²λ μμ²μ λ€λ₯Έ μλ²λ‘ μ λ¬ν μ μλ€.
- μΊμ κ°λ₯μ±(Caching)
- μλ΅μ μΊμ±μ΄ κ°λ₯ν΄μΌ νλ€.
- HTTPμ κΈ°μ‘΄ μΊμ± κΈ°λ₯μ μ¬μ©νμ¬ μλ²μ λΆνλ₯Ό μ€μ΄κ³ μ±λ₯μ ν₯μμν¬ μ μλ€.
- μ) λͺ¨λ νμ΄μ§μ κ³΅ν΅ λ¨Έλ¦¬κΈ λ° μ΄λ―Έμ§κ° μλ μΉ μ¬μ΄νΈλ₯Ό λ°©λ¬Ένλ€κ³ νμ λ μλ‘μ΄ μΉ μ¬μ΄νΈ νμ΄μ§λ₯Ό λ°©λ¬Έν λλ§λ€ μλ²λ λμΌν μ΄λ―Έμ§λ₯Ό λ€μ μ μ‘ν΄μΌ νλ€. μ΄λ₯Ό νΌνκΈ° μν΄ ν΄λΌμ΄μΈνΈλ 첫 λ²μ§Έ μλ΅ νμ ν΄λΉ μ΄λ―Έμ§λ₯Ό μΊμ±νκ±°λ μ μ₯ν λ€μ μΊμμμ μ§μ μ΄λ―Έμ§λ₯Ό μ¬μ©νλ€.
- μ¨λ맨λ μ½λ(Code on Demand)
- μλ²κ° ν΄λΌμ΄μΈνΈμμ μ€ν κ°λ₯ν μ½λλ₯Ό μ μ‘ν μ μλ€.
- μ) μΉ μ¬μ΄νΈμμ λ±λ‘ μμμ μμ±νλ©΄ λΈλΌμ°μ λ μλͺ»λ μ νλ²νΈμ κ°μ μ€μλ₯Ό μ¦μ κ°μ‘° νμνλ€. β μλ²μμ μ μ‘ν μ½λλ‘ μΈν΄ μ΄ μμ
μ μνν μ μλ€.
APIμ λν΄
π‘API λ?
μλ‘ λ€λ₯Έ μννΈμ¨μ΄ μ ν리μΌμ΄μ
μ΄ μλ‘ ν΅μ νκ³ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μκ² ν΄μ£Όλ λ§€κ°μ²΄μ΄μ κ·μΉμ μ§ν©μ΄λ€.
ν΅μ¬ μν
- ν΅λ‘ μν : νλ‘κ·Έλ¨ κ°μ λ°μ΄ν° μ μ‘ ν΅λ‘λ₯Ό μ 곡νλ€.
- νμ€ν : μλ‘ λ€λ₯Έ μΈμ΄λ‘ λ§λ€μ΄μ§ νλ‘κ·Έλ¨μ΄λΌλ APIλΌλ κ³΅ν΅ κ·κ²©μ΄ μλ€λ©΄ λνκ° κ°λ₯νλ€.
- 보μ : λ΄λΆ μμ€ μ½λλ₯Ό 곡κ°νμ§ μκ³ λ νμν κΈ°λ₯λ§ μΈλΆμ λ
ΈμΆνμ¬ μ¬μ©ν μ μκ² νλ€.
λ°°λ¬ μ±μ λ°°λ¬λΉ κ³μ°κΈ° μμ
- μ
λ ₯ λ°μ΄ν°(Request) : μ¬μ©μμ μ§ μ£Όμμ μ£Όλ¬Έ κΈμ‘μ APIμ μ λ¬
- APIμ μν
- μ£Όμλ₯Ό νμΈν΄ μλΉκ³Όμ 거리λ₯Ό κ³μ°
- νμ¬ λ μ¨(λΉκ° μ€λμ§ λ±)μ λ°°λ¬μμ μκΈ μν©μ 체ν¬
- μ£Όλ¬Έ κΈμ‘μ λ°λ₯Έ ν μΈ ννμ μ μ©
- κ²°κ³Ό λ°ν(Response) : μ΅μ’
μ μΌλ‘ μ¬μ©μμκ²λ λ°°λ¬λΉ 3000μμ΄λΌλ κ²°κ³Όλ§ λ± λ³΄μ¬μ€λ€.
- μ£Όμ μμ :
POST /calculate_delivery_fee
calculate(κ³μ°νλ€)λΌλ λμ¬
λμκ΄μ λμ κ²μ ν€μ€μ€ν¬ μμ (RESTful)
- μμ²(Request) : ν€μ€μ€ν¬ νλ©΄μ 짱ꡬλΌλ μ±
μ λͺ©μ μ
λ ₯
- λ΄λΆ μ²λ¦¬ : μμ€ν
μ λμκ΄μ μλ§ κΆμ μ±
DBμμ β짱ꡬβλ₯Ό μ°Ύκ³ , νμ¬ λμΆ μ€μΈμ§, μ΄λ μκ°μ μλμ§ νμΈ
- μλ΅(Response) : λμΆ κ°λ₯/3μΈ΅ λ§νμ±
μ½λ/μ²κ΅¬κΈ°νΈ 811.4λΌλ μ 보λ₯Ό νλ©΄μ λμ΄λ€.
- μ£Όμ μμ :
GET /books/123
π‘μΈν°νμ΄μ€λ?
- λ μ΄μμ΄ λ§μ£Ό λ³΄κ³ μν΅νλ μ μ μ΄λΌλ λ»μΌλ‘ μ°κ²°μ μλ―Έλ₯Ό κ°μ§λ€.
- μ) TV리λͺ¨μ»¨μ μ¬λκ³Ό TV νλ‘κ·Έλ¨μ΄ μν΅νλ μΈν°νμ΄μ€
REST μλ΅μ λν΄
π‘REST μλ΅ μ΄ν΄νκΈ°
-
μν μ½λ(state code) : κ²°κ³Όλ₯Ό μ€λͺ
νλ€. (μ : 200, 201, 204, 400, 401, 404, 500)
-
ν€λ (header) : λ©νλ°μ΄ν° (μ : μ½ν
μΈ -νμ
, μΊμ-μ μ΄, μλ μ ν ν€λ)
-
λ³Έλ¬Έ (body) : λ°μ΄ν° νν (JSON)
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600
X-RateLimit-Remaining: 95
{
"success": true,
"data": {
"product_id": "789",
"name": "Developer Toolkit",
"price": 49.99
}
}"
REST APIμ λν΄
π‘REST API λ?
μμ RESTμμΉμ κΈ°λ°μΌλ‘ ν API μ€κ³ λ°©μμ΄λ€.
- μμ μ±(Safe)
- GET λ©μλ(μ‘°ν)λ μμ νλ€.
- μ μ₯λ λ°μ΄ν°λ₯Ό λ°ννμ§ μλλ€.
- POST, DELETE, PUT, PATCHλ μμ νμ§ μλ€.
- λ°μ΄ν°λ₯Ό μμ±, μμ , μμ νλ€.
- λ©±λ±μ±(Idempotent)
- νλ²μ νΈμΆνκ±°λ μμ²λ²μ νΈμΆνκ±°λ νμ κ²°κ³Όλ κ°λ€.
- GET β κ°μ κ²°κ³Όκ° κ³μ μ‘°νλλ€.
- PUT β μμ ν΄μ λ체λ νμ κ²°κ³Όλ κ³μ κ°λ€.
- DELETE β κ°μ μμ²μ μ¬λ¬λ²ν΄λ μμ λ κ²°κ³Όλ κ°λ€.
- POST β λ©±λ±μ±μ 보μ₯νμ§ μλλ€.
- λλ₯Ό λλ§λ€ λ°μ΄ν°κ° κ³μ μλ‘ μκΉ
- μΊμ κ°λ₯μ±(Cacheable)
- μ¬μ¬μ©μ μν΄ μμ²μ λν μλ΅μ μ μ₯ν μ μμκΉ?
- GET, HEAD, POST λ©μλλ μΊμκ° κ°λ₯νλ€.
- μΌλ°μ μΌλ‘ GET, HEAD μ λλ§ μΊμλ‘ μ¬μ©νλ€.
- λ³κ²½ κ°λ₯μ±μ΄ μ μ μ μ μμ(HTML, CSS, IMAGE, JS λ±)μ μ£Όλ‘ μΊμ±νλ€.
REST APIμ URL λ€μ΄λ° κ·μΉ
-
λͺ
μ¬λ₯Ό μ¬μ©νμ¬ λ¦¬μμ€λ₯Ό νν
- 리μμ€λ λμ¬κ° μλ λͺ
μ¬λ‘ νν
- λ¨μΌ 리μμ€(κ°μ²΄ μΈμ€ν΄μ€ λ±)μ λν΄μλ λ¨μ λͺ
μ¬λ₯Ό μ¬μ©
- ν΄λΌμ΄μΈνΈ λ° μλ² λ¦¬μμ€μ λν΄μλ 볡μ λͺ
μ¬λ₯Ό μ¬μ©
β
μ¬λ°λ₯Έ μμ
GET /users
GET /users/admin
GET /users/{id}/playlists
β μλͺ»λ μμ
GET /getUsers
GET /users/admins
GET /user/{id}/playlist
-
μΌκ΄μ±μ΄ ν΅μ¬
- κ³μΈ΅μ κ΄κ³λ₯Ό λνλ΄κΈ° μν΄μλ μ¬λμ( / )λ₯Ό μ¬μ©
- URL λ§μ§λ§μ μ¬λμ€( / )λ₯Ό μ¬μ©νμ§ μλλ€.
- URL κ°λ
μ±μ μν΄ νμ΄ν( - )μ μ¬μ©
- μΈλλΌμΈ( _ )μ μ¬μ©νμ§ μλλ€.
- URLμ μλ¬Έμλ₯Ό μ¬μ©
β
μ¬λ°λ₯Έ μμ
GET /order-management/customer-orders
GET /order-management/customer-orders/{order-id}
GET /order-management/customer-orders/{order-id}/order-items
β μλͺ»λ μμ
GET /order-management/customer-orders/
GET /ordeManagement/customerOrders
GET /order_management/customer_orders
-
νμΌ νμ₯μλ₯Ό μ¬μ©νμ§ μλλ€.
- URLμ νμΌ νμ₯μλ₯Ό μ¬μ©νμ§ μλλ€.
β
μ¬λ°λ₯Έ μμ
GET /content-management/authors
β μλͺ»λ μμ
GET /content-management/authors.xml
-
CRUD ν¨μ μ΄λ¦μ μ¬μ©νμ§ μλλ€.
- URLμ CRUD κΈ°λ₯μ λνλ΄λ λ¨μ΄λ₯Ό μ¬μ©νμ§ μλλ€.
β
μ¬λ°λ₯Έ μμ
GET /user-accounts
β μλͺ»λ μμ
GET /get-all-users
-
쿼리 νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ 리μμ€λ₯Ό νν°λ§νλ€.
- μλ‘μ΄ API μμ±μ μ§μνκ³ , 쿼리 νλΌλ―Έν°λ₯Ό μ¬μ©ν΄ 리μμ€λ₯Ό νν°λ§νλ€.
β
μ¬λ°λ₯Έ μμ
GET /drivers?status=active
GET /drivers?region=KR&age=30
GET /drivers?page=2&limit=100
REST APIμ μλμ리μ λν΄
π‘REST APIμ μλ μ리
-
ν΄λΌμ΄μΈνΈκ° μμ²μ μμνλ€.
- μ ν리μΌμ΄μ
μ΄ API μ€λν¬μΈνΈμ HTTP μμ²μ 보λΈλ€.
-
λ€νΈμν¬ μ΄λ μμ²
- λ€νΈμν¬ μ΄λ μμ² : μμ²μ HTTP/HTTPSλ₯Ό ν΅ν΄ μΈν°λ·μ ν΅ν΄ μλ²μ λλ¬νλ€.
-
μλ²κ° μμ²μ μ²λ¦¬
- APIλ μ
λ ₯μ κ²μ¦νκ³ λ
Όλ¦¬λ κΈ°λ₯μ μν
-
DB μ΄μ
- νμ μ μλ²κ° DBλ₯Ό μ‘°ννκ±°λ μ
λ°μ΄νΈ νλ€.
-
μλ΅ μμ±
- μλ²λ μν μ½λ, ν€λ, λ³Έλ¬Έμ΄ ν¬ν¨λ ꡬ쑰νλ μλ΅(μ’
μ’
JSON νμ)μ λ°ν
-
λ΅λ³μ΄ λμμ΄
- ν΄λΌμ΄μΈνΈλ μλ΅μ λ°κ³ UI λ λλ§, λ‘κ·Έ, μΆκ° νΈμΆ λ± μ΄λ₯Ό μ²λ¦¬
RESTful APIμ λν΄
π‘REST μ€κ³ μμΉμ μΆ©μ€νκ² μ λλ‘ μ§ν€λ APIλ₯Ό μλ―Έ
- URL + HTTP Methodλ§ λ³΄κ³ λ λ¬΄μ¨ APIμΈμ§ μλ³ν μ μμ΄μΌ νλ€.
| κ΅¬λΆ | REST(λ°°λ¬ μ± λ°©μ) | RESTful(λμκ΄ λ°©μ) |
|---|
| μ€κ³ μ΄μ | μ΄λ€ κΈ°λ₯μ μνν κ²μΈκ°? | μ΄λ€ μμμ λ€λ£° κ²μΈκ°? |
| URL ꡬ쑰 | /get_price, /order_food(λμ¬ ν¬ν¨ κ°λ₯) | /prices, /orders(μ€μ§ λͺ
μ¬λ§ μ¬μ©) |
| κ°λ
μ± | κ°λ°μκ° μ ν κ·μΉμ λ°λ‘ 곡λΆν΄μΌ ν¨ | μ£Όμμ λ©μλλ§ λ΄λ λꡬλ μλλ₯Ό μ΄ν΄ν¨ |
| μκ²©ν¨ | βλ°μ΄ν°λ§ μ μ€κ°λ©΄ λμ§!!β (μ€μ©μ£Όμ) | βμμΉμ μ§μΌμΌ μ μ§λ³΄μκ° μ½λ€β (μμΉ μ£Όμ) |
- λΉ-RESTful:
/get_work_hours?name=νκΈΈλ&start=20240101 (λμ¬ μ¬μ©)
- RESTful:
GET /employees/hong-gildong/work-hours?from=2024-01-01&to=2024-01-31 (μμ μ€μ¬)
π
Q. μ΄ APIλ REST APIμΈκ°μ?
A. 그건 REST APIλΌκ³ λΆλ₯Ό μ μμ§λ§, μμΉμ μ΄κ²ΌμΌλ RESTful νμ§λ μλ€μ.
β μ’ λ μ λ¬Έκ° λλ
RESTful API μμ² μ²λ¦¬ νλ¦(5λ¨κ³)
RESTful API μμ² μ²λ¦¬ νλ¦ (5λ¨κ³)
- [μΆμ
ꡬ] Controller : ν΄λΌμ΄μΈνΈμ μμ²μ κ°μ₯ λ¨Όμ λ°λλ€. μμ² μ£Όμ(URL)μ λ°©μ(GET, POST λ±)μ νμΈνκ³ λ΄λΉμ(Service)μκ² λκΈ΄λ€.
- ν΄λΌμ΄μΈνΈ : βκ·κ²©μ λ§μΆ°μ 보λΌκ²
GETλ°©μμΌλ‘ /users/1μ£Όμλ‘ μμ²!!β
- 컨νΈλ‘€λ¬ : βμ€μΌμ΄, 1λ² μ μ μ 보 λ¬λΌλ κ±°μ§? ServiceμΌ! λ°μ΄ν° μ’ κ°μ Έμ λ΄β
- [κ°λ
] Stateless (무μνμ±) : μ΄ μμ μμ ν΄λΌμ΄μΈνΈκ° λ³΄λΈ μΈμ¦ μ 보(token λ±)λ₯Ό νμΈνλ€.
- βμλ²λ λΉμ μ΄ λκ΅°μ§ κΈ°μ΅νμ§ μλλ€. κ·Έλ¬λ μμ²μμ λͺ¨λ μ 보λ₯Ό λ€ λ΄μμ μκ² μ§?β
- [μΈμ¦/κ²μ¦] Security/Filter (νν°) : (μ ν μ¬ν / μ€μ) μμ²ν μ¬λμ΄ λ§λμ§, κΆνμ΄ μλμ§ νμΈνλ€.
- [μ£Όλ°©] Service (μλΉμ€) : μ€μ ν΅μ¬ λ‘μ§ (κ³μ°, κ°κ³΅ λ±)μ μ²λ¦¬νλ€. λ°μ΄ν°κ° νμνλ©΄ μ°½κ³ (Repository)μ μμ²νλ€.
- DBκ°κΈ° μ : βμ κΉλ§, RepositoryμΌ DBκ°μ 1λ² μ μ μλμ§ νμΈν΄λ΄!β
- DBκ° ν : βλ°μλ€! μ΄ λ°μ΄ν°λ₯Ό ν΄λΌμ΄μΈνΈκ° 보기 μ’κ² κ°κ³΅ν΄μ Controllerμκ² μ€κ²!β
- [μ°½κ³ ] Repository(λ ν¬μ§ν 리) : DBμ μ§μ μ κ·Όνμ¬ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ μ μ₯νλ€.
- βμ¬κΈ° μμ΄!(DBμμ λ°μ΄ν°λ₯Ό κΊΌλ΄ Serviceμ μ λ¬)β
- [λ°ν] Controller : μλΉμ€κ° μ²λ¦¬ν κ²°κ³Όλ₯Ό λ°μμ, ν΄λΌμ΄μΈνΈμκ² κ·κ²©(JSON + μν μ½λ)μ λ§μΆ° μλ΅μ 보λΈλ€.
- βμλ²½ν΄! μν μ½λ
200 ok μ°κ³ , κ²°κ³Όλ¬Όμ JSONμΌλ‘ ν¬μ₯ν΄μ ν΄λΌμ΄μΈνΈμκ² λ³΄λΈλ€.β
- RESTful API λ°°λ¬ μμ€ν
μΌλ‘ μμ
- ν΄λΌμ΄μΈνΈ (μλ): μ±μΌλ‘
GET /pizzas/1 (1λ² νΌμ μ£ΌμΈμ)λΌκ³ κ·κ²©νλ μ£Όλ¬Έμ λ£λλ€.
- Controller (μΉ΄μ΄ν° μ§μ): μ£Όλ¬Έμ μ μνκ³ , μ£Όλ°©(Service)μ μ λ¬ν©λλ€. λ§μ§λ§μ μμ±λ νΌμλ₯Ό μλμκ² λ°°λ¬νλ€.
- Service (μ리μ¬): νΌμλ₯Ό λ§λλλ€. μ¬λ£κ° νμνλ©΄ μ°½κ³ (Repository)μμ κ°μ Έμ¨λ€.
- Repository (μ°½κ³ κ΄λ¦¬μ): λμ₯κ³ (DB)μμ μ¬λ£λ₯Ό κΊΌλ΄ μ리μ¬μκ² μ€λ€.
- μλ΅ (λ°°λ¬): μΉ΄μ΄ν° μ§μμ΄ νΌμμ ν¨κ»
200 OK (μ±κ³΅) μμμ¦μ λΆμ¬ μλμκ² λ³΄λΈλ€.

RESTful API μλ² μλ΅μ 무μμ΄ ν¬ν¨λμ΄μμκΉ?
1. μν νμμ€
- 2xx : μΌλ° μ±κ³΅ μλ΅
- 201 : POST λ©μλ μ±κ³΅ μλ΅
- 4xx : μλ²κ° μ²λ¦¬ν μ μλ μλͺ»λ μμ²(ν΄λΌμ΄μΈνΈ μλͺ»)
- 404 : 리μμ€λ₯Ό μ°Ύμ μ μμ
- 5xx : μλ² λ΄λΆ μ€λ₯
2. λ©μμ§ λ³Έλ¬Έ
- μλ΅ λ³Έλ¬Έμλ 리μμ€ ννμ΄ ν¬ν¨λλ€.
- ν΄λΌμ΄μΈνΈλ λ°μ΄ν° μμ± λ°©μμ XML λλ JSON νμμΌλ‘ μ 보λ₯Ό μμ²ν μ μλ€.
- μ ) ν΄λΌμ΄μΈνΈκ° Johnμ΄λΌλ μ¬λμ μ΄λ¦κ³Ό λμ΄λ₯Ό μμ²νλ©΄ μλ²λ JSON νμμΌλ‘ λ°ννλ€.
'{"name":"John", "age":30}'
3. ν€λ
-
μλ΅μλ μλ΅μ λν ν€λ λλ λ©νμ΄ν°λ ν¬ν¨λλ€.
-
Content-Type (μ€μ!!)
- μλ²κ° 보λ΄λ λ³Έλ¬Έ λ°μ΄ν°κ° μ΄λ€ νμμΈ μλ €μ€λ€.
application/json : κ°μ₯ λ§μ΄ μ°μ΄λ JSON νμ
text/html : HTML νμ΄μ§
image/png : μ΄λ―Έμ§ νμΌ
β μ΄ ν€λκ° μμ΄μΌ ν΄λΌμ΄μΈνΈ(λΈλΌμ°μ )κ° λ°μ΄ν°λ₯Ό κΈμλ‘ λ³΄μ¬μ€μ§, κ·Έλ¦ΌμΌλ‘ 보μ¬μ€μ§ κ²°μ νλ€.
-
Cache-Control
- λ°μ΄ν°λ₯Ό λΈλΌμ°μ μ μΌλ§λ μ€λ μ μ₯(μΊμ±)ν΄λμ§ κ²°μ νλ€.
no-store : μ λ μ μ₯νμ§ λ§λΌ(보μμ΄ μ€μν λ°μ΄ν°)
max-age=3600 : 1μκ° λμμ μλ²μ λ€μ λ¬»μ§ λ§κ³ μ μ₯λ κ±Έ μ¨λΌ
β μ΄λ₯Ό ν΅ν΄ μλ² λΆνλ₯Ό μ€μ΄κ³ μλλ₯Ό λμΌ μ μλ€.
-
Set-Cookie
- μλ²κ° ν΄λΌμ΄μΈνΈμκ² βμ΄ μ 보λ₯Ό λ€ μ»΄ν¨ν°μ μ μ₯ν΄λ¬βλΌκ³ μμ²ν λ μ¬μ©νλ€.
- μ£Όλ‘ λ‘κ·ΈμΈ μΈμ
μ 보λ μ¬μ©μ μ€μ κ°μ μ μ₯νμ¬ λ€μ μμ² λ ν΄λΌμ΄μΈνΈκ° λ€μ λ³΄λΌ μ μκ² νλ€.
- λ§λ£κΈ°κ°(expire, max-age), μ¬μ©λ μμΉ(domain, path)λ₯Ό μ€μ ν μ μλ€.
- μ£Όμν μ
- νμ μλ²μ μ λ¬λλ μ΅μνμ μ λ³΄λ§ μ¬μ©νμ¬ νΈλν½μ μ΅μ ν μμΌμΌ νλ€.
- νμ·¨ λΉνκΈ° μ¬μ°λ 보μμ λ―Όκ°ν κ°μΈμ 보 λ±μ μ μ₯νμ§ μλλ€.
-
Access-Control-Allow-Origin(CORS κ΄λ ¨)
- μ΄ μλ΅μ μ΄λ€ μΉμ¬μ΄νΈμμ μ½μ μ μλμ§ νμ© λ²μλ₯Ό λνλΈλ€.
- 보μμμ μ΄μ λ‘ λΈλΌμ°μ λ λ€λ₯Έ λλ©μΈμμμ API νΈμΆμ λ§λλ°, μ΄λ₯Ό νμ©ν΄μ€ λ μ¬μ©νλ μμ£Ό μ€μν ν€λμ΄λ€.
-
Location
- μλ‘μ΄ λ¦¬μμ€κ° μμ±λμκ±°λ(201 Created), νμ΄μ§κ° μ΄λνμ λ (3XX) μ΄λν URL μ£Όμλ₯Ό λ΄λλ€.
RESTful API μΈμ¦ λ°©λ²μ λν΄
π‘RESTful API μΈμ¦
μΈμ¦μ λΉμ μ΄ λꡬμΈμ§ μ¦λͺ
νλ κ³Όμ μ΄λ€. μλ²λ μ λ’°ν μ μλ μμ²μΈμ§ νμΈν λ€μλ§ λ¦¬μμ€λ₯Ό μ 곡νλ€.
- HTTP κΈ°λ³Έ μΈμ¦ (Basic Auth)
- λ°©μ :
Authorization : Basice [ID:PWλ₯Ό Base64λ‘ μΈμ½λ©ν κ°
- μ£Όμ : Base64λ μνΈνκ° μλ λ¨μ μΈμ½λ©μ΄λ―λ‘, λ°λμ HTTPS μνΈν ν΅μ κ³Ό ν¨κ» μ¬μ©ν΄μΌ νλ€.
- μ λ¬μ μΈμ¦(Bearer/Token Auth)
- λ°©μ :
Authorization: Bearer [Access_Token]
- μ₯μ : μλ²κ° μνλ₯Ό μ μ₯νμ§ μλ(Stateless) RESTμ νΉμ±μ κ°μ₯ μ λ§λ€. ν ν°μ μ ν¨ κΈ°κ°μ μ€μ ν μ μμ΄ λ³΄μμ±μ΄ λλ€.
- API ν€ (API Key)
- λ°©μ: 쿼리 νλΌλ―Έν°λ ν€λ(
x-api-key)μ ν€λ₯Ό ν¬ν¨νλ€.
- μ©λ: μλΉμ€ μ΄μ© κΆν νμΈ λ° νΈλν½ μ ν(Throttling) κ΄λ¦¬μ μ£Όλ‘ μ°μΈλ€.
- OAuth 2.0 (Open Authorization)
- ν΅μ¬: μ¬μ©μκ° μλΉμ€(A)μ μμ μ λΉλ°λ²νΈλ₯Ό μ£Όμ§ μκ³ λ, λ€λ₯Έ μλΉμ€(B)μ μμμ μΈ μ μκ² ν΄μ£Όλ κΆν μμ νμ€μ΄λ€.
- ꡬμ±: Access Token, Refresh Tokenμ μ¬μ©νμ¬ λ§€μ° μΈλ°ν 보μ μ μ΄κ° κ°λ₯νλ€.
- WWW-Authenticate
- λ°©μ : μ΄ ν€λλ μ£Όλ‘ 401 Unauthorized μν μ½λμ ν¨κ» μΈνΈλ‘ μμ§μΈλ€.
- μν©: ν΄λΌμ΄μΈνΈκ° μΈμ¦ μ 보 μμ΄(νΉμ μλͺ»λ μ 보λ‘) 보νΈλ 리μμ€μ μ κ·Όνλ€.
- μλ²μ μλ΅: "μλΌ! (401)"λΌκ³ νλ©΄μ
WWW-Authenticate ν€λμ μ΄λ€ μΈμ¦ λ°©μμ μ¨μΌ νλμ§ μ μ΄μ 보λΈλ€.
WWW-Authenticate: Basic realm="api" (ID/PW λ°©μ μꡬ)
WWW-Authenticate: Bearer realm="token_required" (ν ν° λ°©μ μꡬ)
π μ°Έκ³ μλ£ (Reference)
μ€νλ₯΄ν μΉ κ°λ° κΈ°μ΄ κ°μ μλ£
https://devpro.kr/posts/rest-restful-api/
https://blog.postman.com/rest-api-examples/
https://aws.amazon.com/ko/what-is/restful-api/