기술블로그-Django편

📬 Django 이메일 전송 및 보안 서명 처리

Chansman 2025. 5. 14. 15:24

📬 Django 이메일 전송 및 보안 서명 처리

1️⃣ django.core.mail.send_mail

Django에서는 send_mail() 함수를 통해 간편하게 이메일을 보낼 수 있습니다.

✅ 기본 사용법

from django.core.mail import send_mail

send_mail(
    subject='회원가입 인증',
    message='이메일 본문 내용입니다.',
    from_email='admin@example.com',
    recipient_list=['user@example.com'],
    fail_silently=False,
)

파라미터 설명

subject 이메일 제목
message 본문 내용 (일반 텍스트)
from_email 발신자 이메일
recipient_list 수신자 리스트 (여러 개 가능)
fail_silently True이면 오류 발생 시 무시

💡 설정 예시 (settings.py)

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'youremail@gmail.com'
EMAIL_HOST_PASSWORD = 'yourpassword'

2️⃣ django.core.signing

데이터를 안전하게 서명하거나 검증할 수 있게 해주는 Django의 내장 보안 기능입니다.

from django.core import signing

# 서명된 문자열 생성
signed_data = signing.sign('user@example.com')

# 원래 데이터 복원
original = signing.unsign(signed_data)

📌 sign()과 unsign()은 기본적인 서명/검증 기능 제공

  • 위변조 방지에 효과적
  • 인증 링크, 비밀번호 재설정 등에 유용

3️⃣ TimestampSigner

signing.TimestampSigner는 서명에 유효 시간 제한을 둘 수 있습니다.

from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
import time

signer = TimestampSigner()

# 서명된 문자열 생성
signed_value = signer.sign('user@example.com')

# 서명 해제 (정상)
try:
    original = signer.unsign(signed_value, max_age=60)  # 60초 제한
except SignatureExpired:
    print("링크 만료")
except BadSignature:
    print("위조된 링크")

✅ 활용 예시

  • 이메일 인증 링크에 서명 값 포함
  • 일정 시간 후 링크 만료 처리

✅ 요약 정리

항목 설명

send_mail() 이메일 전송 (SMTP 기반)
sign() / unsign() 문자열 서명/검증 처리
TimestampSigner 유효 기간이 있는 서명 처리
SignatureExpired 서명 만료 예외
BadSignature 위조 시도 예외

📌 이 기능들을 활용하면 안전한 이메일 인증, 비밀번호 재설정, 1회용 토큰 처리 등을 쉽게 구현할 수 있습니다!