Mublo Framework v1.6.0 릴리즈 — SNS 회원이 갇히던 막다른 길, 미이행 주문 탈퇴 보류

wwiz 2026-09-18 15:36 조회 18 수정됨

Mublo Framework v1.6.0 을 릴리즈했습니다.

이번 릴리즈는 SNS 로만 가입한 회원이 갇혀 있던 막다른 길을 걷어내는 것이 중심입니다. 그동안 이 회원들은 자기 비밀번호를 모르는 채로 탈퇴도 비밀번호 설정도 할 수 없었고, 연결을 잘못 끊으면 계정을 영영 잃었습니다. 여기에 처리가 끝나지 않은 주문이 있으면 탈퇴를 보류하는 쇼핑몰 안전장치가 더해졌습니다.

데이터베이스 마이그레이션도 삭제할 파일도 없습니다. 다만 라우트 캐시는 반드시 비워야 합니다 — 아래 업그레이드 항목을 먼저 읽어주세요.


SNS 회원이 갇혀 있던 세 갈래를 열었습니다

SNS 로그인 플러그인은 가입할 때 회원이 알 수 없는 임의 문자열을 비밀번호로 넣어 왔습니다. 그런데 코어의 민감한 작업은 하나같이 현재 비밀번호를 요구했습니다. SNS 로만 가입한 회원에게는 댈 수 있는 값이 없었습니다.

  • 탈퇴할 수 있습니다. 탈퇴 화면은 모두에게 보이는데 비밀번호를 요구해서, SNS 전용 회원은 관리자에게 부탁하는 것 말고는 계정을 지울 방법이 없었습니다. 이제 연결된 제공자로 본인 확인을 하면 탈퇴가 진행됩니다.
  • 비밀번호를 설정할 수 있습니다. 비밀번호 변경이 현재 비밀번호를 요구해서, 만들 수도 되찾을 수도 없는 상태였습니다. 회원정보 수정에서 연결된 제공자로 다시 인증하면 현재 비밀번호 없이 새 비밀번호를 정합니다. 한 번 설정하면 일반 회원과 같아집니다.
  • 마지막 로그인 수단은 이제 끊을 수 없습니다. 비밀번호 없이 그 연결에만 의지하던 회원이 연결 해제를 누르면 그 자리에서 계정에 영영 들어올 수 없었고, 되돌릴 방법도 없었습니다. 이제 다른 연결도 로컬 비밀번호도 없으면 거절하고 비밀번호를 먼저 설정하도록 안내합니다.

이미 가입해 있는 SNS 회원에게 소급 적용되는 것은 없습니다. 그 회원들도 제공자 재인증으로 비밀번호를 설정하면 됩니다.


본인 확인이 비밀번호 말고도 가능해졌습니다

위 세 가지를 떠받치는 코어 변경입니다. 종전에는 "현재 비밀번호 입력"이 본인 확인 역할을 혼자 맡았는데, 비밀번호가 확인 수단의 전부는 아닙니다.

이제 코어는 "방금 본인 확인이 끝났다"는 사실만 보고 무엇으로 확인했는지는 묻지 않습니다. 확인은 현재 세션에 회원과 함께 저장되고 10분 뒤 만료되며, 다른 회원으로 갈아탄 세션에는 넘어가지 않습니다. 확인을 마치면 그 10분 안의 이어지는 민감한 작업에서는 다시 묻지 않습니다.

회원정보 수정과 탈퇴 화면에서는 현재 비밀번호가입한 계정으로 확인이 두 칸으로 나란히 놓입니다. 종전에는 SNS 확인 수단이 비밀번호 칸 아래에 덧붙어 둘의 관계가 드러나지 않았습니다. 좁은 화면에서는 세로로 접힙니다.

비밀번호를 쓰는 회원은 종전과 똑같습니다. 맞게 입력하면 그대로 진행됩니다. 비밀번호를 건드리지 않는 수정(닉네임·추가 필드)은 종전처럼 확인이 필요 없습니다.


SNS 가입도 약관 동의를 받고 이력을 남깁니다

같은 사이트인데 폼으로 가입한 회원만 동의 기록이 있고 SNS 회원은 비어 있었습니다. 약관을 개정해도 "이 회원이 그때 이 내용에 동의했다"를 증명할 수 없었습니다.

  • 가입 약관을 운영하는 사이트에서는 SNS 가입이 동의 화면을 한 번 거칩니다. 코어 가입 1단계와 같은 스킨을 씁니다.
  • 약관을 쓰지 않는 사이트는 종전처럼 한 번에 가입합니다. 설정에 따라 동작이 갈립니다.
  • 동의한 약관의 버전과 내용 해시는 확장이 아니라 코어가 직접 찾아 기록합니다. 필수 약관 누락 판정도 코어가 다시 합니다.

쇼핑몰: 처리가 끝나지 않은 주문이 있으면 탈퇴를 보류합니다

종전에는 배송 중이든 반품 심사 중이든 탈퇴가 그냥 됐습니다. 탈퇴는 포인트 잔액을 0으로 정리하고 회원 쪽 창구를 닫으므로, 그 뒤 취소·반품이 나오면 환불할 곳이 사라집니다.

  • 막히는 범위는 좁습니다 — 결제완료부터 배송완료까지, 그리고 열려 있는 교환·반품입니다. 구매확정과 취소·반품완료는 통과합니다.
  • 결제 전 주문은 결제창이 떠 있을 수 있는 최근 1시간만 막고, 그보다 오래된 것은 버려진 주문으로 보고 통과시킵니다. 그러지 않으면 방치된 한 건이 탈퇴를 영영 막습니다.
  • 무엇을 기다려야 하는지 알 수 있도록 주문번호와 상태를 목록으로 보여줍니다. 거절 사유는 알림창뿐 아니라 화면에도 남습니다 — 알림창은 닫으면 사라져서 그 번호를 들고 주문 내역을 확인하러 갈 수 없었습니다.
  • 어떤 상태를 '이행 중'으로 볼지는 쇼핑 설정의 주문 상태 정의에서 읽습니다. 상태를 바꿔 쓰는 사이트에서도 어긋나지 않습니다.
  • 조회에 실패하면 탈퇴를 막지 않습니다. 쇼핑몰을 쓰지 않는 사이트의 탈퇴까지 멈춰서는 안 되기 때문입니다.

그 밖에 고친 것

  • 자동 가입을 끈 사이트에서 SNS 가입이 중간에 끊기던 것을 고쳤습니다. 약관 동의 뒤 닉네임 입력 화면으로 가야 하는데 홈으로 떨어져 회원이 만들어지지 않고 끝났습니다.
  • SNS 로 가입한 뒤 원래 보던 페이지로 돌아갑니다. 특정 글에서 로그인 버튼을 눌러 가입한 회원이 그 글로 돌아오지 못했습니다.
  • SNS 가입에서 가입 포인트·가입 쿠폰이 지급됩니다. 가입 완료 이벤트를 발행하지 않아 빠져 있었습니다. 이미 가입한 회원에게 소급 지급되지는 않습니다.
  • 프로필 완성으로 가입한 회원에게 관리자가 정한 가입 레벨이 적용됩니다. 이 경로만 레벨을 넘기지 않아, 레벨로 권한을 나눈 사이트에서 가입 방식에 따라 등급이 갈렸습니다.
  • 탈퇴한 SNS 회원이 다시 가입할 수 있습니다. 탈퇴 정리에서 제공자 폐기에 실패하면 로컬 연결 행을 재시도용으로 남겼는데, 그 행이 같은 사람의 재가입을 영구히 막았습니다.
  • SNS 가입 회원의 비밀번호 자리가 빈 값이 됐습니다. 종전의 임의 문자열은 코어가 '비밀번호가 있는 회원'과 구분하지 못하게 만들었습니다. 어떤 입력으로도 로그인되지 않는 것은 종전과 같습니다.
  • 관리자 포인트 지갑(/admin/point) 원장 표에서 좁은 화면일 때 행 높이가 들쭉날쭉하던 것을 맞췄습니다.

업그레이드

v1.5.1 에서: 패치 zip(mublo-1.5.1-to-1.6.0-patch.zip, 변경 파일 34개)을 설치 루트에 덮어씁니다. 삭제할 파일도, 마이그레이션도, composer 의존성 변경도 없습니다. .env 는 덮어쓰지 않습니다.

★ 라우트 캐시를 비워야 합니다. SNS 로그인 플러그인에 주소가 4개 추가됐습니다. 비우지 않으면 약관 동의와 본인 확인 화면이 404 로 떨어집니다.

rm -f storage/cache/routes/*

SNS 로그인 플러그인은 코어와 함께 올라가야 합니다. 패치 zip 에 함께 들어 있습니다. 코어만 덮어쓰고 플러그인을 빼면 SNS 가입이 동작하지 않습니다.

적용 후 관리자 → 시스템 관리 에서 버전이 1.6.0 인지 확인하세요. 마이페이지 화면이 그대로라면 강력 새로고침(Ctrl+F5)으로 확인합니다 — 마이페이지 CSS 가 바뀌었습니다.

마이페이지 스킨(views/Front/Mypage/basic/)을 복사해 고쳐 쓰고 있다면 덮어쓸 때 그 수정이 사라집니다. 반대로 복사본을 지키느라 덮어쓰지 않으면 회원정보 수정·탈퇴 화면의 본인 확인 UI 가 예전 그대로라 SNS 전용 회원은 여전히 갇혀 있습니다. 스킨을 유지하려면 Profile.phpWithdraw.php 의 변경을 손으로 옮기세요.

v1.5.1 미만에서 올라오는 경우에는 v1.5.1 까지 올린 뒤 이 패치를 적용하거나, 전체 배포본으로 교체하세요.


확장을 직접 만드셨다면

커스텀 확장이 아래를 쓰고 있다면 고쳐야 합니다.

  • Contract\Member\MemberAccountGatewayInterface 를 직접 구현한 경우 — create() 의 시그니처가 바뀌었고 notifyRegistered() 가 없어졌습니다. 이제 코어 가입 절차가 트랜잭션과 완료 이벤트를 소유하며, 확장의 추가 저장은 persistRelated(int $memberId) 로 같은 트랜잭션에 참여합니다. create() 를 외부 트랜잭션으로 감싸면 안 되고, 실패는 반환값이 아니라 예외로 옵니다.
  • MemberService::withdraw() 를 호출하는 경우 — 비밀번호 인자가 없어졌습니다.

새로 쓸 수 있게 된 것도 있습니다. Contract\Auth\ReauthenticationInterface 로 자기 방식의 본인 확인을 코어에 알릴 수 있고, ReauthenticationOptionsRenderingEvent 로 확인 수단을 화면에 내놓을 수 있습니다. 회원 계정 계약에는 hasLocalPassword(int $memberId) 가, 약관 조회 계약에는 registerDocuments·validateRegisterAgreements 가 추가됐습니다.

자세한 내용은 docs/reference/extension-core-contracts.md 에 있습니다.


상세 변경 내역

포함된 PR: #65 · #66 · #67 · #68 · #69 · #70 · #71 · #72 · #73 · #74 · #75

1명이 반응했습니다.

글쓰기

댓글 0

등록된 댓글이 없습니다.