1. RESTful API๋?
1.1. REST์ ์ ์์ ๊ธฐ๋ณธ ๊ฐ๋
- REST(Representational State Transfer)๋ ์๋ ์์ด๋ ์น๊ณผ ๊ฐ์ ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ
์ ์ํ ์ํํธ์จ์ด ์ํคํ
์ฒ์ ํ ํ์์.
- REST๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์น์ ๊ธฐ์กด ๊ธฐ์ ๊ณผ HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ
์ฒ ์คํ์ผ.
- REST๋ ๋คํธ์ํฌ ์์์ Client์ Server ์ฌ์ด์ ํต์ ๋ฐฉ์ ์ค ํ๋.
- REST๋ ์์์ ์ด๋ฆ(์์์ ํํ)์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ(์ ๋ณด)๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํจ.
โ ์ฆ, ์์(resource)์ ํํ(representation)์ ์ํ ์ํ ์ ๋ฌ์.
1.2. REST์ SOAP ๋น๊ต
- SOAP(Simple Object Access Protocol)์ XML(eXtensible Markup Language)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ๋กํ ์ฝ๋ก, RESTful API์ ๋น๊ตํ์ฌ ๋ณต์กํ๊ณ ๋ฌด๊ฒ๋ค๋ ํน์ง์ด ์์.
- REST๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํด ์์์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๋ฐ๋ฅด๋ฉฐ, ๊ฐ๋จํ๊ณ ์ง๊ด์ ์.
- SOAP๋ ๋ณด์, ํธ๋์ญ์
๋ฑ์ ์ ๊ณตํ์ง๋ง REST๋ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฑ๋ฅ์ด ์ฐ์ํจ.
1.3. RESTful API์ ํน์ง
- ๋ฌด์ํ์ฑ(Stateless): ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์์.
- ์์ ๊ธฐ๋ฐ(URI): ๊ฐ ์์์ ๊ณ ์ ํ URI๋ก ์๋ณ๋จ.
- ํํ: ์์์ ์ํ๋ JSON(Most), XML ๋ฑ์ผ๋ก ํํ๋จ.
- HTTP ๋ฉ์๋ ํ์ฉ: ์์์ ๋ํ ์์
์ GET, POST, PUT, DELETE ๋ฑ์ HTTP ๋ฉ์๋๋ฅผ ํตํด ์ํ๋จ.
- ์์ฒญ๊ณผ ์๋ต (Request and Response): ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์๋ต์ ๋ฐํํจ. ์์ฒญ์๋ ๋ฉ์๋, URI, ํค๋, ๋ฐ๋ ๋ฑ์ด ํฌํจ๋๊ณ , ์๋ต์๋ ์ํ ์ฝ๋, ํค๋, ๋ฐ๋๊ฐ ํฌํจ๋จ.
2. RESTful API์ ๊ตฌ์ฑ ์์
2.1. ์์(Resource): URI
- ๋ชจ๋ ์์์ URI(Uniform Resource Identifier) ํน์ URL(Uniform Resource Location)์ผ๋ก ์๋ณ๋จ.
- ๊ฐ ์์์ ๊ณ ์ ํ URI๋ฅผ ํตํด ์ ๊ทผํ ์ ์์.
- e.g.
/users๋ ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๊ณ , /users/{id}๋ ํน์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ํ๋.
2.2. ํ์(Verb): HTTP ๋ฉ์๋
- POST(Create): ์์ ์์ฑ
- GET(Read): ์์ ์กฐํ
- PUT(Update): ์์ ์
๋ฐ์ดํธ
- DELETE(Delete): ์์ ์ญ์
- HEAD: Header ์ ๋ณด ์กฐํ
2.3 ํํ(Representationย ofย Resource)
- Client๊ฐ ์์์ ์ํ(์ ๋ณด)์ ๋ํ ์กฐ์์ ์์ฒญํ๋ฉด Server๋ ์ด์ ์ ์ ํ ์๋ต(Representation)์ ๋ณด๋
- ํ๋์ ์์์ JSON, XML, TEXT, RSS ๋ฑ ์ฌ๋ฌ ํํ์ Representation์ผ๋ก ๋ํ๋ด์ด ์ง ์ ์์.
- JSONย ํน์ย XML๋ฅผย ํตํดย ๋ฐ์ดํฐ๋ฅผย ์ฃผ๊ณ ย ๋ฐ๋ย ๊ฒ์ดย ์ผ๋ฐ์ ์.
3. RESTful API ์ค๊ณ ์์น
3.1. ๊ฐ๊ฒฐํ๊ณ ๋ช
ํํ URI ์ค๊ณ
- RESTful API ์ค๊ณ์์ URI๋ ์์์ ๋ช
ํํ ์๋ณํ๊ณ ์๋ฏธ ์๋ ๋ฐฉ์์ผ๋ก ์ ์ํด์ผ ํจ.
/users์ ๊ฐ์ ๋ณต์กํ์ง ์๊ณ ์ง๊ด์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์.
3.2. HTTP ๋ฉ์๋์ ์ ์ ํ ์ฌ์ฉ
- HTTP ๋ฉ์๋๋ ์์์ ๋ํ ์์
์ ๋ช
ํํ๊ฒ ์ ์ํ๋ ์ค์ํ ์์์.
- e.g. ๋ฐ์ดํฐ ์กฐํ๋
GET, ๋ฐ์ดํฐ ์์ฑ์ POST, ์
๋ฐ์ดํธ๋ PUT, ์ญ์ ๋ DELETE๋ฅผ ์ฌ์ฉํจ.
3.3. ์ํ ์ฝ๋(State Codes)์ ์๋ฌ ์ฒ๋ฆฌ
- RESTful API๋ ์์ฒญ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ HTTP ์ํ ์ฝ๋๋ก ์ ๋ฌํจ.
- e.g. 200๋ฒ๋ ์ฝ๋๋ ์ฑ๊ณต, 400๋ฒ๋ ์ฝ๋๋ ํด๋ผ์ด์ธํธ ์ค๋ฅ, 500๋ฒ๋ ์ฝ๋๋ ์๋ฒ ์ค๋ฅ๋ฅผ ๋ํ๋.
- RESTful API๋ ์์ฒญ๊ณผ ์๋ต์ ํ์ํ ์ ๋ณด๋ฅผ ํค๋์ ๋ด์ ์ ๋ฌํจ.
- ๋ํ, API์ ๋ณด์์ ์ํด ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ์ ์ ํ ๊ตฌํํด์ผ ํจ.
4. FastAPI๋ก RESTful API ๊ตฌํํ๊ธฐ
4.1. FastAPI ์๊ฐ ๋ฐ ์ค์น
- FastAPI๋ Python์ ์ฌ์ฉํ ๊ณ ์ฑ๋ฅ ์น ํ๋ ์์ํฌ๋ก, RESTful API๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ์ค๊ณ๋จ.
- FastAPI ์๋ฒ๋ฅผ ์คํํ๋ ค๋ฉด WSGI (Web Server Gateway Interface)์๋ฒ, ํน์ ํ๋ก์ ์๋ฒ๊ฐ ํ์ํจ
WSGI (Web Server Gateway Interface)
WSGI๋ Python ์น ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์น ์๋ฒ ๊ฐ์ ํ์ค ์ธํฐํ์ด์ค
- ๋๊ธฐ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋จ.
- Flask๋ Django์ ๊ฐ์ ๋๊ธฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์ฃผ ์ฌ์ฉ๋จ.
- WSGI ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฒญ์ ๋ฐ์ ์น ์๋ฒ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ํํ๋ก ๋ณํํ์ฌ ์ ๋ฌํจ.
- Gunicorn์ด๋ uWSGI ๊ฐ์ ์๋ฒ๊ฐ WSGI ์๋ฒ๋ก ๋๋ฆฌ ์ฌ์ฉ๋จ.
ํ๋ก์ ์๋ฒ (Proxy Server)
ํ๋ก์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ค์ ์๋ฒ ์ฌ์ด์์ ์์ฒญ๊ณผ ์๋ต์ ์ค๊ณํ๋ ์๋ฒ
- Nginx๋ Apache์ ๊ฐ์ ์น ์๋ฒ๊ฐ ์ฃผ๋ก ํ๋ก์ ์๋ฒ๋ก ์ฌ์ฉ๋จ.
- ์ฃผ์ ์ญํ :
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ค์ ๋ฐฑ์๋ ์๋ฒ๋ก ์ ๋ฌ.
- ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๋ณด์, SSL ์ข
๋ฃ, ์บ์ฑ ๋ฑ์ ์์
์ ์ฒ๋ฆฌ.
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํธ๋ํฝ์ ๊ด๋ฆฌํ๊ณ ์ต์ ํํจ.
4.2. ์ฒซ ๋ฒ์งธ API ์์ฑ
FastAPI๋ฅผ ์ด์ฉํด ๊ฐ๋จํ API๋ฅผ ์์ฑํ๋ ์์
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
uvicorn main:app --reload
4.3. GET, POST, PUT, DELETE ์์
FastAPI๋ HTTP ๋ฉ์๋๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ์ง์ํจ.
- GET:
/items๋ก GET ์์ฒญ ์ ์์ดํ
๋ฆฌ์คํธ๋ฅผ ๋ฐํ.
- POST:
/items๋ก POST ์์ฒญ ์ ์๋ก์ด ์์ดํ
์ ์ถ๊ฐ.
- PUT:
/items/{id}๋ก PUT ์์ฒญ ์ ํน์ ์์ดํ
์ ์
๋ฐ์ดํธ.
- DELETE:
/items/{id}๋ก DELETE ์์ฒญ ์ ํน์ ์์ดํ
์ ์ญ์ .
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
items = []
@app.get("/items", response_model=List[Item])
def get_items():
return items
@app.post("/items", response_model=Item)
def create_item(item: Item):
items.append(item)
return item
@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: int, item: Item):
if item_id >= len(items) or item_id < 0:
raise HTTPException(status_code=404, detail="Item not found")
items[item_id] = item
return item
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
if item_id >= len(items) or item_id < 0:
raise HTTPException(status_code=404, detail="Item not found")
deleted_item = items.pop(item_id)
return {"message": "Item deleted", "item": deleted_item}
uvicorn main:app --reload
4.4. ๋ฐ์ดํฐ ๊ฒ์ฆ(Pydantic ๋ชจ๋ธ ์ฌ์ฉ)
FastAPI๋ Pydantic ๋ชจ๋ธ์ ์ฌ์ฉํด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ ์ ์์.
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
description: str = None
4.5. API ๋ฌธ์ํ(Swagger UI)
- FastAPI๋ Swagger UI๋ฅผ ํตํด API ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค.
/docs ๊ฒฝ๋ก๋ก ์ ๊ทผํ๋ฉด API๋ฅผ ์ฝ๊ฒ ํ
์คํธํ๊ณ ๋ฌธ์ํํ ์ ์์.
Flask๋ก RESTful API ๊ตฌํํ๊ธฐ
5.1. Flask ์๊ฐ ๋ฐ ์ค์น
Flask๋ ๊ฐ๋จํ๊ณ ์ ์ฐํ Python ์น ํ๋ ์์ํฌ๋ก, RESTful API๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋ง์ด ์ฌ์ฉ๋จ. pip install flask๋ก ์ค์นํ ์ ์์.
5.2. ๊ฐ๋ฒผ์ด API ์์ฑ
Flask๋ก ๊ฐ๋จํ RESTful API๋ฅผ ์์ฑํ๋ ์์
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def hello():
return jsonify({"message": "Hello, Flask!"})
if __name__ == "__main__":
app.run(debug=True)
python app.py
์ด์ ์๋ฒ๊ฐ ์ผ์ก๊ณ , http://127.0.0.1:5000์ ์ ์ํ๋ฉด,
์๋์ ๊ฐ์ด ๋ฏธ๋ฆฌ ๋ง๋ dict๊ฐ ๋ฌ๋ค.

5.3. Flask-restful ํ์ฅ ํจํค์ง ์ฌ์ฉํ๊ธฐ
Flask๋ Flask-restful์ด๋ผ๋ ํ์ฅ ๋ชจ๋์ ํตํด RESTful API๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์.
from flask import Flask
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
class Item(Resource):
def get(self, item_id):
return {"item": item_id}
api.add_resource(Item, '/item/<int:item_id>')
if __name__ == "__main__":
app.run(debug=True)
python app.py
์ด์ ์๋ฒ๊ฐ ์ผ์ก๊ณ , http://127.0.0.1:5000/item/1004๋ก ์ ์ํ๋ฉด,
์๋์ ๊ฐ์ด ๋ฏธ๋ฆฌ ๋ง๋ dict๊ฐ ๋ฌ๋ค.

6. RESTful API ๋ณด์
6.1. ์ธ์ฆ(Authentication)๊ณผ ๊ถํ ๋ถ์ฌ(Authorization)
- RESTful API์์๋ ์ฌ์ฉ์์ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๊ฐ ํ์์ ์.
- JWT(JSON Web Token)๋ฅผ ์ฌ์ฉํ์ฌ API์ ์ธ์ฆ์ ์ฒ๋ฆฌํจ.
- ํ๋ก๋์
ํ๊ฒฝ์์๋ SSL ์ธ์ฆ(Secure Sockets Layer) ๋๋ TLS ์ธ์ฆ(Transport Layer Security)์ ์ ์ฉํ๋ ๊ฒ์ด ํ์ํจ
6.2. JWT(JSON Web Token)์ด๋?
- JWT๋ API์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์.
- JWT๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์
์ ์๋ฒ์์ ๊ด๋ฆฌํ์ง ์๊ณ ๋ ์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์์.
- JWT๋ ํค๋(Header), ํ์ด๋ก๋(Payload), ์๋ช
(Signature) ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋จ.
-
Header (ํค๋):
- JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ํค๋๋ก, ํ ํฐ์ ํ์
(์ผ๋ฐ์ ์ผ๋ก JWT)๊ณผ ์๋ช
์๊ณ ๋ฆฌ์ฆ(์: HMAC SHA256, RSA ๋ฑ)์ ์ง์ .
- e.g
{"alg": "HS256", "typ": "JWT"}
-
Payload (ํ์ด๋ก๋):
-
ํ์ด๋ก๋์๋ ์ ์กํ ์ ๋ณด๊ฐ ๋ค์ด ์์.
-
์ด ์ ๋ณด๋ ํด๋ ์(claims)์ด๋ผ๊ณ ํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ๋ฐ์ ํ ์๋ฒ์์ ์ด๋ค ์ ๋ณด๊ฐ ํ์ํ์ง ํฌํจ.
-
e.g. ์ฌ์ฉ์ ID, ์ญํ (role), ๋ง๋ฃ ์๊ฐ(expiration) ๋ฑ์ด ํฌํจ๋ ์ ์์
-
ํด๋ ์์ ํฌ๊ฒ ์ธ ๊ฐ์ง๋ก ๋ถ๋ฅ:
- ๋ฑ๋ก๋ ํด๋ ์(Registered claims): JWT์์ ์ ์๋ ๊ธฐ๋ณธ ํด๋ ์(์: sub, iat, exp ๋ฑ)
- ๊ณต๊ฐ ํด๋ ์(Public claims): ์์คํ
์์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์๋ ํด๋ ์
- ๋น๊ณต๊ฐ ํด๋ ์(Private claims): ๋ ์์คํ
๊ฐ์ ํฉ์๋ ๋ฐ์ดํฐ
-
e.g. {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
-
Signature (์๋ช
):
- ์๋ช
์ ํค๋์ ํ์ด๋ก๋๊ฐ ๋ณ์กฐ๋์ง ์์์์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ.
- ์๋ช
์ header์ payload๋ฅผ ๋น๋ฐ ํค(secret key)์ ํจ๊ป ์๋ช
์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ์ํธํํ์ฌ ์์ฑ
- e.g.
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload), secret_key)
6.3 JWT์ ์ฌ์ฉ ํ๋ฆ
-
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ:
- ์ฌ์ฉ์๊ฐ ์๋ฒ์ ๋ก๊ทธ์ธํ ๋, ์๋ฒ๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ JWT๋ฅผ ์์ฑ.
- ์ด JWT๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค.
-
JWT ์ ์ฅ:
- ํด๋ผ์ด์ธํธ๋ ๋ฐ์ JWT๋ฅผ ์ ์ฅํ๊ณ , ์ดํ ์๋ฒ์์ ํต์ ์์ ์ด ํ ํฐ์ HTTP ํค๋์ ํฌํจํ์ฌ ๋ณด๋
-
JWT ์ ์ก:
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ Authorization ํค๋์ Bearer์ ํจ๊ป JWT๋ฅผ ํฌํจ.
- e.g.
Authorization: Bearer <JWT>
-
์๋ฒ์์ JWT ๊ฒ์ฆ:
- ์๋ฒ๋ ๋ฐ์ JWT๋ฅผ ๊ฒ์ฆํ์ฌ, ์ ํจํ ํ ํฐ์ธ์ง, ๋ณ์กฐ๋์ง ์์๋์ง, ๋ง๋ฃ๋์ง๋ ์์๋์ง๋ฅผ ํ์ธ.
- ์ ํจํ ํ ํฐ์ด๋ผ๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
6.4. API Rate Limiting๊ณผ CORS ์ค์
- API์ ๋จ์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด Rate Limiting์ ์ค์ ํ ์ ์์.
- ๋ํ, CORS(Cross-Origin Resource Sharing)๋ฅผ ์ค์ ํ์ฌ ํน์ ๋๋ฉ์ธ๋ง API์ ์ ๊ทผํ๋๋ก ์ ํํ ์ ์์.