[Feature] 관리자 로그인 API (ADM-01) #36

Closed
opened 2026-02-09 13:07:18 +00:00 by seonkyu.kim · 0 comments
Owner

설명

관리자 로그인 API를 구현한다. JWT 기반 인증으로 Access Token과 Refresh Token을 발급한다.

  • 기능 ID: ADM-01
  • 요구사항 ID: SYS-03
  • API URI: POST /v1/in/auth/login
  • 보안 등급: 3 (E2EE)

상세 프로세스

  1. 사용자 검증

    • Email로 Admin 조회
    • BCrypt 비밀번호 해시 일치 여부 확인
    • 계정 상태 확인 (IsDeleted, IsActive)
  2. 토큰 발급

    • Access Token 생성 (JWT, Claims: AdminId, Role, ServiceCode)
    • Refresh Token 생성 (랜덤 문자열)
    • Refresh Token Redis 저장 (선택, 추후)
  3. 로그 기록

    • 최종 로그인 일시 업데이트 (LastLoginAt)
    • 접속 IP 기록 (선택)

체크리스트

Application Layer

  • SPMS.Application/DTOs/Auth/LoginRequestDto.cs — 로그인 요청 DTO
  • SPMS.Application/DTOs/Auth/LoginResponseDto.cs — 로그인 응답 DTO (AccessToken, RefreshToken, ExpiresIn)
  • SPMS.Application/Interfaces/IAuthService.cs — 인증 서비스 인터페이스
  • SPMS.Application/Services/AuthService.cs — 로그인 비즈니스 로직 구현

Infrastructure Layer

  • SPMS.Infrastructure/Persistence/Repositories/AdminRepository.cs — IAdminRepository 구현 (ByEmail)

API Layer

  • SPMS.API/Controllers/AuthController.cs — 인증 컨트롤러
  • POST /v1/in/auth/login 엔드포인트 구현
  • Swagger GroupName, SwaggerOperation 어노테이션 적용

검증 및 테스트

  • 빌드 성공 확인
  • Swagger UI에서 API 테스트
  • 에러 케이스 확인 (잘못된 이메일, 잘못된 비밀번호, 비활성 계정)

Request/Response 예시

Request:

{
    "email": "admin@example.com",
    "password": "password123"
}

Response (성공):

{
    "result": true,
    "code": "000",
    "msg": "로그인 성공",
    "data": {
        "access_token": "eyJhbGciOiJI...",
        "refresh_token": "abc123...",
        "expires_in": 3600
    }
}

Response (실패 - 111):

{
    "result": false,
    "code": "111",
    "msg": "이메일 또는 비밀번호가 일치하지 않습니다.",
    "data": null
}

관련 문서

  • Documents/Feature_Spec.md — ADM-01
  • Documents/API_Specification.md — API_SPMS_02_AUTH_04
  • Documents/Error_Codes.md — 111 (로그인 실패)
## 설명 관리자 로그인 API를 구현한다. JWT 기반 인증으로 Access Token과 Refresh Token을 발급한다. - **기능 ID**: ADM-01 - **요구사항 ID**: SYS-03 - **API URI**: `POST /v1/in/auth/login` - **보안 등급**: 3 (E2EE) ## 상세 프로세스 1. **사용자 검증** - Email로 Admin 조회 - BCrypt 비밀번호 해시 일치 여부 확인 - 계정 상태 확인 (IsDeleted, IsActive) 2. **토큰 발급** - Access Token 생성 (JWT, Claims: AdminId, Role, ServiceCode) - Refresh Token 생성 (랜덤 문자열) - Refresh Token Redis 저장 (선택, 추후) 3. **로그 기록** - 최종 로그인 일시 업데이트 (LastLoginAt) - 접속 IP 기록 (선택) ## 체크리스트 ### Application Layer - [ ] `SPMS.Application/DTOs/Auth/LoginRequestDto.cs` — 로그인 요청 DTO - [ ] `SPMS.Application/DTOs/Auth/LoginResponseDto.cs` — 로그인 응답 DTO (AccessToken, RefreshToken, ExpiresIn) - [ ] `SPMS.Application/Interfaces/IAuthService.cs` — 인증 서비스 인터페이스 - [ ] `SPMS.Application/Services/AuthService.cs` — 로그인 비즈니스 로직 구현 ### Infrastructure Layer - [ ] `SPMS.Infrastructure/Persistence/Repositories/AdminRepository.cs` — IAdminRepository 구현 (ByEmail) ### API Layer - [ ] `SPMS.API/Controllers/AuthController.cs` — 인증 컨트롤러 - [ ] `POST /v1/in/auth/login` 엔드포인트 구현 - [ ] Swagger GroupName, SwaggerOperation 어노테이션 적용 ### 검증 및 테스트 - [ ] 빌드 성공 확인 - [ ] Swagger UI에서 API 테스트 - [ ] 에러 케이스 확인 (잘못된 이메일, 잘못된 비밀번호, 비활성 계정) ## Request/Response 예시 **Request:** ```json { "email": "admin@example.com", "password": "password123" } ``` **Response (성공):** ```json { "result": true, "code": "000", "msg": "로그인 성공", "data": { "access_token": "eyJhbGciOiJI...", "refresh_token": "abc123...", "expires_in": 3600 } } ``` **Response (실패 - 111):** ```json { "result": false, "code": "111", "msg": "이메일 또는 비밀번호가 일치하지 않습니다.", "data": null } ``` ## 관련 문서 - `Documents/Feature_Spec.md` — ADM-01 - `Documents/API_Specification.md` — API_SPMS_02_AUTH_04 - `Documents/Error_Codes.md` — 111 (로그인 실패)
seonkyu.kim added the
Priority
High
Status
Available
Type
Feature
labels 2026-02-09 13:07:47 +00:00
seonkyu.kim added this to the Phase 2-1: 인증 & 계정 & 서비스 API milestone 2026-02-09 13:10:25 +00:00
seonkyu.kim added
Status
In Progress
and removed
Status
Available
labels 2026-02-09 13:17:06 +00:00
seonkyu.kim self-assigned this 2026-02-09 13:22:38 +00:00
seonkyu.kim added
Status
Done
and removed
Status
In Progress
labels 2026-02-09 13:56:14 +00:00
Sign in to join this conversation.
No description provided.