Skip to content

feat(admin): 관리자 로그인/로그아웃 및 인증 boundary 구현 - #112

Merged
s26059-maker merged 4 commits into
developfrom
feature/111-admin-auth
Sep 23, 2026
Merged

s26059-maker merged 4 commits into
developfrom
feature/111-admin-auth

Conversation

@s26059-maker

@s26059-maker s26059-maker commented Sep 21, 2026 •

Copy link
Copy Markdown

관련 Issue

Closes #111

작업 내용

  • POST /api/v1/admin/auth/login: env 기반 관리자 계정 BCrypt 검증, 성공 시 HttpOnly 세션 쿠키 발급
  • POST /api/v1/admin/auth/logout: 현재 세션 무효화, 쿠키 삭제, 204
  • admin_sessions 테이블(V18): 토큰은 SHA-256 다이제스트만 저장, 로그인 시점 기준 고정 TTL
  • AdminAuthenticationInterceptor: /api/v1/admin/** 인증 boundary (login만 제외), Agent 인증과 같은 구조
  • AdminLoginAttemptRateLimiter: IP + username 기준 고정 윈도우
  • ErrorCode 5개 추가: ADMIN_CREDENTIAL_INVALID, ADMIN_LOGIN_RATE_LIMITED, ADMIN_LOGIN_FAILED, ADMIN_SESSION_INVALID, ADMIN_LOGOUT_FAILED

⚠️ Breaking Change

기존 /api/v1/admin/robots도 새 boundary에 포함되어 이제 관리자 로그인이 필요합니다.
이 API를 호출하는 클라이언트는 로그인 후 세션 쿠키를 함께 보내야 합니다.
(RobotManagementIntegrationTest는 세션 쿠키를 붙이도록 수정)

보안

  • 비밀번호 평문 저장 X, env로 BCrypt 해시 주입
  • credential 미설정 시 로그인 항상 실패 (fail-closed)
  • 존재하지 않는 username도 더미 해시로 검증해 응답 시간 차이 제거
  • password, 해시, 토큰이 로그에 남지 않음 (OutputCaptureExtension으로 확인)
  • 쿠키: HttpOnly, Path=/api/v1/admin, SameSite=Strict, Secure (local만 false)
  • Boot 기본 인메모리 유저 비활성화 (generated password 로그 제거)

새 환경변수

이름 기본값
POPPY_ADMIN_USERNAME 없음 (필수)
POPPY_ADMIN_PASSWORD_HASH 없음 (필수, BCrypt)
POPPY_ADMIN_SESSION_TTL PT8H
POPPY_ADMIN_LOGIN_ATTEMPT_WINDOW PT1M
POPPY_ADMIN_LOGIN_MAX_ATTEMPTS 5
POPPY_ADMIN_COOKIE_SAME_SITE Strict
POPPY_ADMIN_COOKIE_SECURE true
POPPY_ADMIN_SESSION_CLEANUP_INTERVAL_MILLISECONDS 설정값
POPPY_ADMIN_LOGIN_ATTEMPT_CLEANUP_INTERVAL_MILLISECONDS 설정값
POPPY_ADMIN_LOGIN_IP_MAX_ATTEMPTS 20

해시 생성 방법은 docs/configuration.md 참고. 배포 전 실제 값 주입 필요.

테스트

  • ./gradlew build 통과 (318 tests, 실패 0)
  • 로그인 성공/실패/400/credential 미설정, rate limit 429 및 윈도우 복구, 로그아웃 204 및 재사용 401, 위조/만료 세션 401, boundary 보호 확인
  • 새 통합 테스트 2개는 공유 Postgres 연결 한도 때문에 Hikari 풀 크기 축소
  • scripts/test-systemd-deployment.sh는 Windows CRLF로 로컬 실패 (develop 원본도 동일, 무관)

후속 과제

  • CSRF: 전역 disable 상태라 SameSite에 의존
  • CORS: 관리자 웹이 다른 origin이면 CORS + SameSite 조정 필요
  • rate limit: remoteAddr 기준이라 프록시 뒤에서는 IP가 뭉침, 인메모리라 재시작 시 초기화
  • Actuator/Swagger 여전히 permitAll
  • IP 제한(20회)은 행사장 NAT/프록시 환경에서 여러 관리자가 같은 IP를 공유하면 함께 소진될 수 있음, 배포 환경에 맞춰 조정 필요
  • Compose Secure 기본값이 true라 HTTP로 띄우면 쿠키가 저장되지 않음 (localhost 제외), HTTP 테스트 시 POPPY_ADMIN_COOKIE_SECURE=false 명시

@s26059-maker s26059-maker self-assigned this Sep 21, 2026
@github-actions github-actions Bot added domain: admin admin 도메인 변경 feature 새로운 기능 작업 test 테스트 관련 작업 labels Sep 21, 2026

@inryeok-bot inryeok-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 결과

변경된 35개 파일을 검토했으며, 수정이 필요한 문제 2개를 발견했습니다.

심각도 개수
Critical 0
High 1
Medium 1
Low 0

주요 내용

  • HIGH · SECURITY — username을 바꾸면 로그인 요청 제한을 무제한 우회할 수 있습니다
  • MEDIUM · SECURITY — Docker Compose가 관리자 세션 쿠키의 Secure 기본값을 비활성화합니다

검토한 head: 1fb16ffb0676

Comment thread docker-compose.yml Outdated
@exijn

exijn commented Sep 22, 2026

Copy link
Copy Markdown
Member

제목 수정하세요

@s26059-maker s26059-maker changed the title Feature/111 admin auth feat(admin): 관리자 로그인/로그아웃 및 /api/v1/admin/** 인증 boundary 구현 (#111) Sep 22, 2026
@exijn

exijn commented Sep 22, 2026

Copy link
Copy Markdown
Member

/review

@inryeok-bot inryeok-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 결과

변경된 35개 파일을 검토했으며, 수정이 필요한 문제 3개를 발견했습니다.

심각도 개수
Critical 0
High 2
Medium 1
Low 0

주요 내용

  • HIGH · SECURITY — SameSite=None 설정 시 관리자 API가 CSRF에 노출됩니다
  • HIGH · SECURITY — 리버스 프록시 환경에서는 한 공격자가 모든 관리자 로그인을 차단할 수 있습니다
  • MEDIUM · SECURITY — 다중 인스턴스에서 로그인 제한을 우회할 수 있습니다

재리뷰 비교

구분 개수
새로운 Finding 3
계속 확인된 Finding 0
이번 리뷰에서 다시 발견되지 않음 2

이번 리뷰에서 다시 발견되지 않았다는 것이 해결을 확정하는 것은 아닙니다.

재실행한 검토 결과입니다.

검토한 head: 5281740c3da6

@s26059-maker s26059-maker changed the title feat(admin): 관리자 로그인/로그아웃 및 /api/v1/admin/** 인증 boundary 구현 (#111) feat(admin): 관리자 로그인/로그아웃 및 인증 boundary 구현 Sep 23, 2026
@s26059-maker
s26059-maker merged commit 19545b2 into develop Sep 23, 2026
4 checks passed
@s26059-maker
s26059-maker deleted the feature/111-admin-auth branch September 23, 2026 00:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

domain: admin admin 도메인 변경 feature 새로운 기능 작업 test 테스트 관련 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants