코딩 개발일지

장고DRF 이메일 인증 기능( 동기 방식 ) 본문

AI 본 교육/AI 12주차

장고DRF 이메일 인증 기능( 동기 방식 )

호기호 2023. 11. 3. 01:10

1. 필요한 라이브러리 설치

pip install django djangorestframework django-rest-auth


2. 이메일 전송을 위한 SMTP 서버에 대한 설정을 settings.py에 작성

# 이메일 인증
EMAIL_PORT = 587                                                         # SMTP 포트 번호 (기본값 쓰면 됌)
EMAIL_HOST = 'smtp.gmail.com'                                    # 메일 호스트 서버 (기본값 쓰면 됌)
EMAIL_HOST_USER = 'a43521118@gmail.com'            # 서비스에서 사용할 Gmail
EMAIL_HOST_PASSWORD = 'aaaa bbbb cccc dddd'     # 서비스에서 사용할 Gmail의 앱 password

# TLS 보안 설정 - SMTP 서버와 통신할 때 TLS(보안) 연결을 사용할지 여부.
# 보통 587 포트에서 명시적 TLS 연결에 사용됨. 기본값은 False.
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

 

  • EMAIL_HOST_USER  : 이 계정으로 이메일을 보냄
  • EMAIL_HOST_PASSWORD  : 이 부분은 보안 상 주의 !! 공개하지말고, 따로 보관 하시길 !!
    (아래의 사진을 참고해서 [ 구글 계정 관리 > 보안 > 앱 비밀번호 생성 ] )

 

  • EMAIL_USE_TLS  : 이 설정은 SMTP 서버와의 통신 시 TLS(보안) 연결을 사용할지 여부를 지정함.
    기본값 False이고, True로 설정하면 TLS를 사용한다.
  • TLS (Transport Layer Security) : 네트워크 통신을 암호화하는 프로토콜.
    데이터를 전송 과정에서 보안 위협을 방지하기 위해 사용.
  • DEFAULT_FROM_EMAIL  : 이메일의 발신자 주소를 설정. 보통 EMAIL_HOST_USER와 같은 값을 사용함.
    이 주소는 이메일 수신자가 보게되는 발신자 주소다.

3. 이메일 인증 발송 함수 작성 (views.py)

일단 필요한 것들을 import 해줘야 겠쥬??

# 이메일인증 import
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes
from django.core.mail import send_mail
# 이메일 인증 발송
class SendVerificationEmailView(APIView):
    def post(self, request):
        user = User.objects.get(email=request.data['email'])

        token = default_token_generator.make_token(user)
        uid = urlsafe_base64_encode(force_bytes(user.pk))
        verification_url = f"http://127.0.0.1:8000/users/verify-email/{uid}/{token}/"

        subject = '이메일 확인 링크'
        message = f'이메일 확인을 완료하려면 다음 링크를 클릭하세요: {verification_url}'
        from_email = 'a43521118@gmail.com'
        recipient_list = [user.email]

        send_mail(subject, message, from_email, recipient_list)

        return Response(status=status.HTTP_200_OK)

 

  • token=default_token_generator.make_token(user)
    default_token_generator는 Django에서 제공하는 토큰 생성기이다.
    user 객체를 사용하여 이메일 확인을 위한 토큰을 생성했다 !!
  • uid=urlsafe_base64_encode(force_bytes(user.pk))
    user의 기본 키(pk)를 안전한 형식(Base64 문자열에서 -와 _를 +와 /로 대체)으로 인코딩한다.
    이 인코딩된 값은 이메일 확인 링크 URL에 포함됨!
  • verification_url = f"http://127.0.0.1:8000/users/verify-email/{uid}/{token}/"
    uid와 token 값을 사용하여 이메일 확인을 위한 URL을 생성.
    뒤에 만들 이메일 인증을 완료시키는 함수의 url 경로이다 !!! (urls.py)
  • send_mail( )
    Django의 send_mail 기능으로 이메일을 전송함.
    subject : 이메일의 제목
    message : 이메일의 내용. 이 내용에 f스트링으로 위의  {verification_url} url주소 넣어줌.
    from_email : 보내는 사람
    recipient_list : 받는 사람

요로코롬 메일이 옵니당. subject, message, from_email, recipient_list 비교해보면 똑같쥬??


4. urls.py 작성

from django.urls import path
from users import views

urlpatterns = [
    path('send-verification-email/', views.SendVerificationEmailView.as_view(), name='send_verification_email_view'),
    path('verify-email/<str:uidb64>/<str:token>/', views.VerifyEmailView.as_view(), name='verify_email_view'),
]

 

이메일 인증을 발송하는 url을 만드는 김에 인증 완료시키는 url까지 작성했다 !!! 어차피 만들거잖아요~


5. 이메일 인증 완료 함수 작성 (views.py)

# 이메일 인증 완료
class VerifyEmailView(APIView):
    def get(self, request, uidb64, token):
        uid = urlsafe_base64_decode(uidb64)
        user = User.objects.get(id=uid)

        if default_token_generator.check_token(user, token):
            user.is_active = True
            user.save()
        return Response(status=status.HTTP_200_OK)
  • uid = urlsafe_base64_decode(uidb64)
    uidb64 값은 URL에서 안전하게 전송되어야 하므로, 이 값을 다시 원래의 사용자 기본 키(pk)로 디코딩한다.
    (user를 식별하는 데 사용)
  • default_token_generator.check_token(user, token)
    아까도 썼죠?? default_token_generator를 사용하여 이메일 확인을 위한 토큰을 생성하여 user의 데이터를 검사한다.

지금까지만든 이메일 인증은 작동은 하지만, 비동기 방식을 이용하지 않는(직렬적인) 방식이라서 로딩이 오래걸리고 비효율 적이다.

 

그래서 보통은 비동기 방식을 이용해서 이메일 인증기능을 만든다.

Celery 는 python 동시성 프로그래밍에서 가장 많이 사용되는 방법 중 하나로 실시간 처리에 중점을 두고 작업 예약을 지원하는 작업 큐이다.

이 과정에서 client와 worker 사이에 broker(중간자)가 있어서 중개한다.

 

일단,,, 강의들을게 산더미라서 다음 프로젝트때 공부하면서 비동기 방식까지 해볼 예정 ~.~