본문으로 건너뛰기

[Open WebUI] 이메일 인증 시 이중 조회를 단일 JOIN으로 교체

PR 링크: open-webui/open-webui#21010 상태: Merged | 변경: +12 / -5

들어가며

사용자 인증은 모든 요청의 시작점입니다. Open WebUI의 authenticate_user_by_email 함수는 이메일로 인증할 때 Auth 테이블을 먼저 조회하고, 결과가 있으면 User 테이블을 다시 조회하는 이중 쿼리 패턴을 사용하고 있었습니다. 두 테이블이 같은 id를 공유하므로 JOIN으로 한 번에 처리할 수 있습니다.

핵심 코드 분석

Before (auths.py):

def authenticate_user_by_email(self, email, db=None):
    try:
        with get_db_context(db) as db:
            auth = db.query(Auth).filter_by(email=email, active=True).first()
            if auth:
                user = Users.get_user_by_id(auth.id, db=db)
                return user
    except Exception:
        return None

After:

def authenticate_user_by_email(self, email, db=None):
    try:
        with get_db_context(db) as db:
            result = (
                db.query(Auth, User)
                .join(User, Auth.id == User.id)
                .filter(Auth.email == email, Auth.active == True)
                .first()
            )
            if result:
                _, user = result
                return UserModel.model_validate(user)
            return None
    except Exception:
        return None

왜 이게 좋은가

  • 인증 쿼리 2회(Auth SELECT + User SELECT)가 JOIN 1회로 줄어듭니다
  • 데이터베이스 라운드트립이 절반으로 감소하여 네트워크 지연이 있는 환경에서 효과가 더 큽니다
  • Users.get_user_by_id 내부의 추가적인 세션 관리 오버헤드도 제거됩니다
  • Auth와 User 테이블이 id 컬럼으로 1:1 관계이므로 JOIN은 자연스러운 선택입니다
  • 인증은 거의 모든 API 요청에서 호출되므로 전체 시스템 성능에 미치는 영향이 큽니다

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글