Skip to content

[Auth] 사업장 회원가입·초기 ADMIN 계정 생성 API 구현 #43

Description

@hywznn

한 줄 목표

회원가입 화면에서 사업장과 최초 담당자 계정을 실제로 등록하고, 가입한 이메일로 바로 로그인할 수 있게 합니다.

확인된 문제

Client의 SignupPage는 화면 유효성 검사만 한 뒤 /?signup=success로 이동합니다.

TODO(backend): POST /api/auth/signup

Server에는 로그인·재발급·로그아웃 API는 있지만 회원가입 API가 없습니다. 따라서 현재 화면에서 가입해도 companyuser_account가 생성되지 않습니다.

공식 API

POST /api/v1/auth/signup

요청

{
  "company_name": "한빛정밀",
  "display_name": "김경민",
  "email": "name@company.com",
  "password": "8자 이상의 비밀번호"
}

화면의 workplacecompany_name, namedisplay_name으로 매핑합니다. confirmPassword는 Client에서 일치 여부만 확인하며 Server에 전송하지 않습니다.

성공 응답

  • 201 Created
  • 생성된 user_id, company_id, 사업장명, 담당자 표시 이름, 이메일, ADMIN 역할 반환
  • Access/Refresh Token을 자동 발급하지 않고 기존 로그인 화면으로 이동

구현 범위

  • Signup request/response DTO와 Bean Validation
  • Company와 최초 ADMIN UserAccount를 같은 transaction에서 생성
  • 비밀번호 BCrypt hash 저장과 원문 비저장
  • user_account.display_name 후속 Flyway migration
  • 이메일 소문자·공백 정규화와 전역 중복 방지
  • 중복 이메일의 안정적인 409 EMAIL_ALREADY_REGISTERED
  • 회원가입 성공·거부 privacy-safe Auth audit event
  • POST /api/v1/auth/signup Public Security 경로 등록
  • 가입 직후 기존 /api/v1/auth/login 성공 확인
  • OpenAPI 요청·응답·오류 예시와 README 갱신

보안·개인정보 규칙

  • 비밀번호, password hash, 이메일 원문을 일반 로그·감사로그에 남기지 않습니다.
  • 비밀번호는 8~128자, BCrypt 한계 때문에 UTF-8 72바이트 이하로 제한합니다.
  • Client가 보낸 role과 companyId는 받지 않습니다. 최초 계정은 Server가 항상 ADMIN으로 결정합니다.
  • 사업장과 계정 중 하나만 생성되는 상태가 없도록 transaction rollback을 검증합니다.
  • 자동 로그인하지 않으며 Refresh Token을 응답 본문에 넣지 않습니다.
  • 이메일 인증·초대·MFA·비밀번호 재설정은 별도 후속 기능입니다.
  • 외부 공개 운영 전에는 API Gateway 또는 배포 경계의 회원가입 Rate Limit 정책을 추가로 확정합니다.

완료 조건

  • 정상 가입에서 Company와 ADMIN이 한 번씩 생성됩니다.
  • 저장된 비밀번호가 원문이 아니며 가입한 비밀번호로 로그인됩니다.
  • 같은 이메일을 대소문자·공백만 바꿔 다시 가입해도 409이고 새 Company가 남지 않습니다.
  • 잘못된 이메일·짧거나 긴 비밀번호·빈 사업장명·빈 담당자명은 400입니다.
  • 요청으로 role, company_id, 알 수 없는 field를 보내면 반영되지 않고 안전하게 거부됩니다.
  • OpenAPI와 전체 테스트·PostgreSQL migration validation이 통과합니다.

경계

  • Server는 사업장과 초기 계정 생성만 담당합니다.
  • Client는 workplace/name을 공식 API field로 변환하고 오류를 화면에 표시합니다.
  • 이용약관·개인정보 처리방침의 실제 동의 UI·버전·시각 보존 정책은 제품 정책 확정 후 별도 이슈로 다룹니다.

관계

Metadata

Metadata

Assignees

Labels

area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외priority:P0MVP 진행을 막는 최우선 핵심 작업security:privacy개인정보·접근권한·토큰·보안 영향이 있는 작업type:feature사용자 또는 Agent가 사용하는 기능 개발

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions