๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Programming/Python

[FastAPI] API ํ‚ค๋กœ ์ธ์ฆ ์ ์šฉํ•˜๊ธฐ | API KEY

by ๋ญ…์ฆค 2024. 8. 6.
๋ฐ˜์‘ํ˜•

์˜ค๋Š˜์€ FastAPI๋ฅผ ์‚ฌ์šฉํ•ด์„œ API๋ฅผ ์ œ๊ณตํ•  ๋•Œ API ํ‚ค๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ด์š”. API ํ‚ค๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด ๋ณผ๊ฒŒ์š” ~!


API ํ‚ค๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

API ํ‚ค(API Key)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž์˜ˆ์š”. API ํ‚ค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์‚ฌ์šฉ๋ผ์š”:

  1. ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ: ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธ
  2. ์‚ฌ์šฉ ์ถ”์  ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง: ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ค API ํ˜ธ์ถœ์„ ํ–ˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋ง
  3. ์š”์ฒญ ์ œํ•œ: ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ๋‚ด์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Œ

 

FastAPI์—์„œ API ํ‚ค ์ ์šฉํ•˜๊ธฐ

 

API ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑํ•˜๊ธฐ

from fastapi import FastAPI, Depends, HTTPException, Security
from fastapi.security.api_key import APIKeyHeader

app = FastAPI()

API_KEY = "your-secret-api-key"
API_KEY_NAME = "access_token"
api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False)

def get_api_key(api_key_header: str = Security(api_key_header)):
    if api_key_header == API_KEY:
        return api_key_header
    else:
        raise HTTPException(
            status_code=403, detail="Could not validate credentials"
        )

@app.get("/protected-route")
async def protected_route(api_key: str = Depends(get_api_key)):
    return {"message": "You have access to this route"}

@app.get("/unprotected-route")
async def unprotected_route():
    return {"message": "This route is open to everyone"}

 

 

 

Python์œผ๋กœ API ํ˜ธ์ถœํ•˜๊ธฐ

import requests

url = "http://localhost:8000/protected-route"
headers = {
    "access_token": "your-secret-api-key"
}

response = requests.get(url, headers=headers)
print(response.json())

 

 

curl๋กœ API ํ˜ธ์ถœํ•˜๊ธฐ

curl -X 'GET' \
  'http://localhost:8000/protected-route' \
  -H 'access_token: your-secret-api-key'

 


 

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ณดํ˜ธ๋œ ๊ฒฝ๋กœ(/protected-route)์— ์ ‘๊ทผํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ API ํ‚ค๊ฐ€ ํ•„์š”ํ•ด์š”. API ํ‚ค๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด 403 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜์ฃ ! ์—ฌ๊ธฐ๊นŒ์ง€ FastAPI์—์„œ API ํ‚ค๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์–ด์š”. API ๊ฐœ๋ฐœ ์‹œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณ ๋ คํ•ด ๋ณด๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ ค์š” !

 

๋ฐ˜์‘ํ˜•

'๐Ÿ’ป Programming > Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[python] ํ˜„์žฌ ํŒŒ์ผ์˜ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์†์‰ฝ๊ฒŒ ์ฐพ๊ธฐ: os.path ๋Œ€์‹  pathlib ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2024.07.30
[python] Streamlit ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ตํžˆ๊ธฐ ! | ํ…์ŠคํŠธ & ๋ฐ์ดํ„ฐ ํ‘œ์‹œ | ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ | ํŒŒ์ผ ์—…๋กœ๋“œ & ๋‹ค์šด๋กœ๋“œ  (0) 2024.07.14
[python] ์ค‘๊ณ ๊ธ‰์ž๋ฅผ ์œ„ํ•œ ํŒŒ์ด์ฌ ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฟ€ํŒ 8๊ฐ€์ง€ : ๋” ๊น”๋”ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ!  (0) 2024.07.11
[python] ํŒŒ์ด์ฌ ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฟ€ํŒ 8๊ฐ€์ง€ : ๋” ๊น”๋”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ๋†’์€ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ!  (0) 2024.07.11
[python] Streamlit ์œผ๋กœ ๋ฐ์ดํ„ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ! | ๊ฐ„๋‹จํ•œ ๋Œ€์‹œ๋ณด๋“œ & ์›น๋ฐ๋ชจ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ  (1) 2024.07.08