반응형
안전한 API 구축을 위한 보안 강화와 인증/인가 매커니즘
안녕하세요! 오늘은 안전한 API를 구축하기 위해 꼭 알아두어야 할
보안 강화와 인증/인가 매커니즘에 대해 쉽게 설명해드리려고 합니다.
특히 JWT 기반 인증 구현 그리고 CORS 설정과 HTTPS 적용에 대해 알아보겠습니다.
1. JWT(Json Web Token) 기반 인증 구현
JWT란 무엇인가요?
JWT는 Json Web Token의 약자로, 사용자 인증을 위해 사용하는 토큰 기반의 인증 방식입니다. 서버는 사용자가 로그인하면 JWT를 생성하여 클라이언트에 전달하고, 클라이언트는 이후의 요청마다 이 토큰을 서버에 보내 인증을 받습니다.
왜 JWT를 사용할까요?
- 상태 비저장(stateless): 서버는 세션을 유지할 필요가 없어 확장성이 좋습니다.
- 편리한 사용: 토큰만 있으면 인증이 가능하므로, 모바일 앱이나 SPA(Single Page Application)에서 유용합니다.
간단한 예제
JWT 생성하기
import jwt
from datetime import datetime, timedelta
SECRET_KEY = "your_secret_key"
def create_jwt(user_id):
payload = {
"user_id": user_id,
"exp": datetime.utcnow() + timedelta(hours=1)
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
return token
JWT 검증하기
def verify_jwt(token):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
user_id = payload["user_id"]
return user_id
except jwt.ExpiredSignatureError:
# 토큰 만료
return None
except jwt.InvalidTokenError:
# 유효하지 않은 토큰
return None
FastAPI에서의 사용
from fastapi import FastAPI, Header, HTTPException
app = FastAPI()
@app.get("/protected")
def protected_route(Authorization: str = Header(None)):
if Authorization is None:
raise HTTPException(status_code=401, detail="Authorization header missing")
token = Authorization.split(" ")[1]
user_id = verify_jwt(token)
if user_id is None:
raise HTTPException(status_code=401, detail="Invalid or expired token")
return {"message": f"Hello, user {user_id}"}
2. CORS 설정과 HTTPS 적용
CORS란 무엇인가요?
CORS(Cross-Origin Resource Sharing)는 다른 출처의 리소스에 접근할 수 있게 해주는 메커니즘입니다. 기본적으로 웹 브라우저는 다른 출처의 리소스에 대한 요청을 제한합니다.
왜 CORS 설정이 필요한가요?
프론트엔드와 백엔드가 다른 도메인이나 포트를 사용할 때, CORS 설정을 하지 않으면 요청이 차단됩니다.
FastAPI에서 CORS 설정하기
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost:3000", # 허용할 도메인
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
HTTPS 적용하기
HTTPS는 HTTP 프로토콜에 SSL/TLS 암호화를 추가한 것으로, 데이터 전송 시 보안을 강화합니다.
로컬 개발 환경에서 HTTPS 적용하기
- Self-signed certificate를 생성하여 개발 서버에 적용합니다.
- uvicorn을 사용할 경우 SSL 옵션을 설정합니다.
$ uvicorn main:app --host 0.0.0.0 --port 8000 --ssl-keyfile=./key.pem --ssl-certfile=./cert.pem
프로덕션 환경에서 HTTPS 적용하기
- 인증된 SSL 인증서를 구매하거나 Let's Encrypt와 같은 무료 서비스를 이용합니다.
- 웹 서버(Nginx, Apache 등)에 SSL을 설정하고 애플리케이션을 배포합니다.
마무리
오늘은 안전한 API 구축을 위해 꼭 필요한 보안 강화와 인증/인가 매커니즘에 대해 알아보았습니다.
- JWT 기반 인증으로 간편하고 확장성 있는 인증 시스템을 구축할 수 있습니다.
- CORS 설정과 HTTPS 적용으로 애플리케이션의 보안을 한층 더 강화할 수 있습니다.
이러한 보안 기술들은 현대 웹 개발에서 필수적입니다. 실제로 적용해보시고, 더욱 안전한 애플리케이션을 만들어보세요!
감사합니다.
728x90
반응형
'Coding > Python' 카테고리의 다른 글
[Python & Matplotlib] 명사 추출 후 다양한 그래프로 시각화하기 !! (1) | 2024.11.28 |
---|---|
FastAPI에서 데이터베이스 모델링과 ORM 사용 전략(SQLAlchemy) (4) | 2024.11.11 |
FastAPI에서 HTTPException과 로깅으로 에러를 효율적으로 처리하는 방법 (1) | 2024.11.06 |
Pydantic을 활용한 데이터 검증과 설정 관리 (1) | 2024.11.05 |
비동기 프로그래밍과 FastAPI의 효율성 (5) | 2024.11.04 |
댓글