웹 서비스를 개발하다보니 데이터 전송 보안 관련 된 것도 공부가 필요하여 요점만 정리해보았습니다.
장고로는 데이터 전송 보안 기능도 쉽게 뚝딱 구현할 수 있는데요.
장고 및 nginx, 서버에서 데이터 전송 보안을 어떻게 구현 할 수 있는지 키워드 위주로만 일단 정리해보았습니다.
1. HTTPS 사용
전송 중 데이터 암호화
클라이언트와 서버 간에 전송되는 데이터를 HTTPS를 사용하여 암호화 할 수 있습니다.
이는 전체 통신 채널을 암호화하여 데이터 가로채기 및 도청을 방지할 수 있습니다.
AWS 에서
- AWS ACM을 사용하면 간단하게 SSL/TLS 인증서를 받을 수 있습니다.
서버 에서
- Let’s Encrypt, Comodo 또는 기타 CA와 같은 신뢰할 수 있는 인증 기관(CA)에서 SSL/TLS 인증서를 얻을 수 있습니다.
- Let’s Encrypt는 무료 SSL/TLS 인증서를 제공하기 때문에 인기 있는 선택입니다.
- 우분투에서
sudo apt-get install certbot
을 통해서 cerbot를 설치하고 nginx 설정만 변경하면 구현 할 수 있습니다.
2. 인증 및 승인 구현
사용자 신원 확인
- 인증 메커니즘(예: OAuth, JWT)을 사용하여 승인된 사용자만 API에 액세스할 수 있도록 합니다.
- JWT는 장고에서 djangorestframework-simplejwt 패키지를 통해서 구현 할 수 있습니다.
- pip 패키지 매니저를 통해서 다운 받을 수 있고 settings.py와 urls.py만 수정하면 손쉽게 구현 할 수 있습니다.
역할 기반 액세스 제어(RBAC)
- 중요한 데이터의 노출을 최소화하기 위해 사용자 역할 및 권한을 기반으로 특정 리소스에 대한 액세스를 제한합니다.
- 장고의 내장 클래스인 Group, Permission을 사용해서 역할과 permission을 정의하고
@permission_required
을 통해서 권한을 체크 할 수 있습니다.
3. 입력 검증 및 정리
삽입 공격 방지
SQL 주입 기타 주입 공격으로부터 보호하기 위해 모든 입력 데이터를 검증해야 합니다.
django 에서
- 장고에서는 SQL대신 ORM을 사용함으로서 SQL 주입을 방지 할 수 있습니다.
4. 속도 제한 및 제한
무차별 대입 공격으로부터 API를 보호하고 지정된 기간 내에 클라이언트가 보낼 수 있는 요청 수를 제어하기 위해 속도 제한 및 조절을 구현합니다.
django 에서
- DRF에서 UserRateThrottle, AnonRateThrottle 클래스를 통해서 사용자 당 하루 요청 개수를 제한 할 수 있습니다.
Nginx 에서
- nginx 설정 파일 (/etc/nginx/nginx.conf) 에서 초당 요청 수를 제한 할 수도 있습니다.
5. 서버 데이터 암호화
서버에 저장된 민감한 데이터를 암호화하여 데이터 침해 시 무단 액세스로부터 서버를 보호할 수 있습니다.
django 에서
- 파이썬의 cryptography 라이브러리를 통해서 데이터 암호화를 달성할 수 있습니다.
- 모델을 필드를 상속 받아서 암호화 필드를 cryptography.fernet 으로 정의하여 구현 할 수 있습니다.
- 시리얼라이져에서도 유사하게 암호화를 구현할 수 있습니다.
- 데이터 암호화 및 복호화 과정은 작업에 오버헤드를 추가할 수 있기 때문에 성능 영향을 테스트 해줘야 합니다.
6. 로깅 및 모니터링
로깅 및 모니터링을 구현하여 액세스 및 사용 패턴을 추적하고, 의심스러운 활동을 감지하고, 잠재적인 보안 사고에 즉시 대응합니다.
AWS 에서
- CloudWatch를 통해서 CPU, 메모리 사용량 등을 모니터링 하고 알람을 설정할 수 있습니다.
Nginx 에서
- Nginx에서는 기본적으로 엑세스 로그를 제공합니다 (
/var/log/nginx/access.log
) - Prometheus, Grafana 를 사용하여 Nginx 측정 항목을 모니터링 할 수 있습니다.
7. 교차 원본 리소스 공유(CORS)
API에 요청할 수 있는 도메인을 제한하도록 CORS 정책을 구성하여 교차 원본 공격의 위험을 줄입니다.
CORS(Cross-Origin Resource Sharing)는 웹사이트가 다른 도메인의 리소스를 요청할 수 있도록 하는 브라우저 기능입니다. 이는 어떤 웹사이트가 서로 상호 작용할 수 있는지 제어하고 보호하여 무단 데이터 공유를 방지하는 데 도움이 됩니다.
짧게 말해 특정 도메인에서만 API 서버에 엑세스 할 수 제어할 수 있다는 의미입니다.
django 에서
- django-cors-headers 패키지를 통해서 손쉽게 CORS를 정할 수 있습니다.
8. CSRF 보호
CSRF(Cross-Site Request Forgery) 공격은 사용자가 인증된 다른 웹 애플리케이션에서 원치 않는 작업을 실행하도록 속입니다.
이는 사용자 브라우저에 대한 사이트의 신뢰를 악용하여 공격자가 사용자 동의 없이 양식 제출이나 설정 변경과 같은 작업을 수행할 수 있도록 허용합니다.
이는 form에 anti CSRF 토큰을 구현하고 서버 측에서 이러한 토큰의 유효성을 검사함으로써 방지할 수 있습니다.
django 에서
- Template에서 {% csrf_token %}를 사용하여 CSRF 토큰을 포함시킬 수 있습니다.
- 장고에서는 form으로 POST 요청 시, {% csrf_token %}가 설정 되지 않는다면 오류를 발생시킵니다.