[파이썬] mongoengine 사용자 정의 세션 및 인증

소개

Mongoengine은 MongoDB를 사용하는 파이썬 애플리케이션을 간편하게 개발할 수 있는 ODM(Object Document Mapper)입니다. 기본 세션 및 인증 메커니즘도 제공하지만, 때로는 이를 커스터마이즈해야 할 수도 있습니다. 이 블로그 게시물에서는 Mongoengine을 사용하여 사용자 정의 세션과 인증을 구현하는 방법을 알아보겠습니다.

요구 사항

이 예제를 따라하기 위해서는 다음이 필요합니다.

사용자 정의 세션 모델

우리의 첫 번째 단계는 사용자 정의 세션 모델을 작성하는 것입니다. 사용자 정의 세션 모델은 사용자의 인증 정보와 세션 데이터를 저장할 MongoDB 컬렉션입니다. 다음은 사용자 정의 세션 모델의 예입니다.

from mongoengine import Document, StringField, DateTimeField, DictField

class Session(Document):
    user_id = StringField(required=True)
    session_data = DictField(required=False)
    created_at = DateTimeField(required=True)

위의 코드에서 Session 이라는 클래스는 mongoengine.Document 를 상속받습니다. 이 모델은 user_id, session_data, created_at 필드를 가지고 있습니다. user_id 필드는 세션과 연결된 사용자의 고유 식별자입니다. session_data 필드는 세션 데이터를 저장하기 위한 딕셔너리입니다. created_at 필드는 세션의 생성 시간을 저장하는 데 사용됩니다.

사용자 정의 인증 로직

이제 사용자 정의 인증 로직을 작성해보겠습니다. 사용자 정의 인증 로직은 사용자가 제공한 로그인 자격 증명을 확인하고 유효한 인증이 있는지 확인해야 합니다.

from mongoengine import connect, DoesNotExist
from datetime import datetime
from bcrypt import checkpw

from .models import Session

def authenticate(username, password):
    try:
        session = Session.objects.get(user_id=username)
        
        if checkpw(password.encode('utf-8'), session.user_id.password):
            session.created_at = datetime.now()
            session.save()
            return True
        
        return False
      
    except DoesNotExist:
        return False

def get_user_by_id(user_id):
    try:
        session = Session.objects.get(user_id=user_id)
        return session.user_id
        
    except DoesNotExist:
        return None

위의 코드에서 authenticate 함수는 주어진 사용자 이름과 비밀번호를 사용하여 사용자 인증을 수행합니다. Session 모델에서 user_id 필드로 해당 사용자를 찾은 다음, 제공된 비밀번호를 해시화하여 저장된 비밀번호와 일치하는지 확인합니다. 인증에 성공하면 세션의 created_at 필드를 업데이트하고 저장합니다.

get_user_by_id 함수는 주어진 사용자 ID로 사용자를 검색합니다. 유효한 세션이 있는 경우 해당 사용자를 반환하고, 그렇지 않은 경우 None을 반환합니다.

세션 관리

마지막으로 세션 관리 로직을 작성해보겠습니다. 이 로직은 로그인 후 사용자 세션을 생성하거나, 사용자 세션을 가져오고, 세션을 삭제하는 기능을 제공합니다.

from datetime import datetime, timedelta
from .models import Session

def create_session(user_id, session_data=None):
    session = Session(user_id=user_id, session_data=session_data, created_at=datetime.now())
    session.save()
    return session.id

def get_session(session_id, expiration_time=timedelta(hours=1)):
    session = Session.objects.get(id=session_id)
    if session.created_at + expiration_time < datetime.now():
        session.delete()
        return None
    return session

def delete_session(session_id):
    Session.objects.get(id=session_id).delete()

위의 코드에서 create_session 함수는 주어진 사용자 ID와 세션 데이터를 사용하여 새 세션을 생성합니다. get_session 함수는 주어진 세션 ID로 세션을 검색하고, 만료 시간을 확인하여 세션을 반환하거나 삭제합니다. delete_session 함수는 주어진 세션 ID로 세션을 삭제합니다.

결론

Mongoengine을 사용하여 사용자 정의 세션 및 인증을 구현하는 방법을 알아보았습니다. 사용자 정의 세션 및 인증은 애플리케이션에 대한 보다 세밀한 제어와 보안을 제공합니다. 이를 통해 사용자가 로그인되어 있음을 확인하고 세션 데이터를 사용하여 사용자 지향 기능을 구현할 수 있습니다.

더 많은 정보를 원한다면 Mongoengine 공식 문서를 참조하세요.