Notice
Recent Posts
Recent Comments
반응형
관리 메뉴

HM소프트

네이버·카카오 소셜 로그인 구현과 bcrypt 함정 — 교육 플랫폼 (2) 본문

외주 개발일지

네이버·카카오 소셜 로그인 구현과 bcrypt 함정 — 교육 플랫폼 (2)

HM소프트 2026. 6. 13. 05:42
반응형

passlib 1.7.4와 최신 bcrypt 버전 비호환으로 가입은 되는데 로그인이 안 되는 함정을 추상화를 걷어 내 해결하고, 네이버·카카오 OAuth 인가 코드 흐름을 구현한다. 비밀번호 nullable 전환, 외부 ID·이메일 3단계 회원 매핑, JWT 발급과 리다이렉트 토큰 전달까지 단일 회원으로 수렴시킨다.

네이버·카카오 소셜 로그인 구현과 bcrypt 적용 중 만난 함정을 정리한다.

 

2편: 인증

1편에서 상품·카테고리·복합 필터를 다뤘다. 커머스에서 구매로 이어지려면 회원가입·로그인이 매끄러워야 한다. 이번 편은 기본 인증과 소셜 로그인(네이버·카카오), 그리고 거기서 만난 bcrypt 호환성 함정이다.

가입 장벽을 낮추기 — 소셜 로그인

이메일 회원가입만 있으면 이탈이 크다. 특히 커머스는 "결제 직전에 가입하라"는 순간 많이 떨어진다. 그래서 국내 사용자가 많이 쓰는 네이버·카카오 소셜 로그인을 붙였다.

두 제공자 모두 OAuth 흐름은 동일하다.

사용자 → [소셜 로그인 버튼] → 제공자 인증 화면 → 동의 → 콜백(code)
      → 서버가 code로 토큰 교환 → 프로필 조회 → 우리 회원과 매핑(없으면 생성) → 로그인

네이버·카카오를 차례로 구현하며, 콜백 처리와 "외부 프로필 → 우리 회원 매핑"을 공통화했다. 처음 들어온 소셜 사용자는 우리 회원으로 생성하고, 이미 있으면 연결한다.

함정: bcrypt 호환성

회원가입에서 비밀번호를 bcrypt로 해싱하는데, 여기서 호환성 문제를 만났다. bcrypt는 라이브러리·버전에 따라 해시 형식(prefix $2a$/$2b$/$2y$)이나 입력 길이 제한(72바이트) 처리가 미묘하게 다르다. 이게 어긋나면 "가입은 됐는데 로그인이 안 되는" 치명적 버그가 된다.

bcrypt 호환성을 맞춰 가입·로그인이 일관되게 동작하도록 수정했다. 동시에 회원가입 흐름에서 휴대폰 인증 버튼을 제거해 가입 단계를 단순화했다(가입 장벽 최소화).

# 비밀번호 검증은 항상 같은 라이브러리/설정으로 — 해시·검증 짝을 맞춘다
import bcrypt
def hash_pw(pw: str) -> bytes:
    return bcrypt.hashpw(pw.encode("utf-8"), bcrypt.gensalt())
def verify_pw(pw: str, hashed: bytes) -> bool:
    return bcrypt.checkpw(pw.encode("utf-8"), hashed)

해싱과 검증이 같은 구현·설정을 쓰는 게 핵심이다. 한쪽이 다른 라이브러리/버전이면 형식이 안 맞아 검증이 실패한다.

인증과 커머스의 연결

인증은 단독 기능이 아니라 커머스 전체와 엮인다.

  • 주문: 로그인한 회원에 주문이 묶인다.
  • 회원 관리: 주문 취소, 회원 탈퇴 같은 흐름(3편의 알림과 연결).
  • 계정 설정: 1편의 Category 기반 학년 선택 등.

소셜 로그인으로 들어온 사용자도 결국 우리 회원 모델로 통일되니, 이후 모든 커머스 기능이 "회원" 한 가지만 보면 된다.

정리하며

  • 소셜 로그인(네이버·카카오)으로 가입 장벽을 낮춤 — OAuth 흐름과 회원 매핑을 공통화.
  • bcrypt 호환성이 "가입은 되는데 로그인 안 됨" 버그의 원인 — 해싱·검증을 같은 구현으로 통일.
  • 가입 단순화(휴대폰 인증 제거)도 전환율을 위한 선택.
  • 인증으로 들어온 사용자를 단일 회원 모델로 통일해 커머스 전체와 연결.

다음 마지막 3편에서는 배포·운영·알림(Docker·CI/CD·메일)으로 시리즈를 마친다.

반응형