공개 로그인 관리자 진입 개선
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
## 2026-08-13 v1.12.17 — 공개 관리자 로그인은 관리자 진입으로 이어져야 한다
|
||||
|
||||
공개 사이트에서 owner/admin 계정으로 로그인한 사용자는 이미 같은 회원 계정으로 인증된 상태이므로, `/admin` 진입 때 별도 관리자 로그인을 다시 요구하면 계정 모델이 사용자에게 어긋나 보인다. 공개 로그인 시 관리자 권한 계정에는 관리자 세션을 함께 발급하고, 기존 공개 세션만 남은 경우에도 `/admin/api/auth/me`가 현재 권한과 세션 버전을 확인한 뒤 관리자 세션을 발급하도록 한다. 공개 헤더에는 관리자 권한 회원에게만 `사이트 관리` 링크를 노출해 관리자 화면으로 바로 이동할 수 있게 하고, 공개 로그아웃은 두 세션을 함께 정리한다.
|
||||
|
||||
## 2026-08-13 v1.12.16 — 운영 DB 볼륨은 프로젝트명에 맡기지 않는다
|
||||
|
||||
UGREEN Docker 앱에서 Compose 프로젝트명이 `soristudio`에서 `sori-studio`로 달라지면서 PostgreSQL named volume 실제 이름도 바뀌고, 컨테이너가 기존 운영 볼륨 대신 새 빈 볼륨을 물어 init 스크립트를 다시 실행하는 상황이 확인됐다. 기존 운영 데이터는 `soristudio_sori-studio-postgres` 볼륨에 남아 있으므로, `docker-compose.yml`의 DB 볼륨 실제 이름을 `POSTGRES_VOLUME_NAME` 기본값으로 고정해 프로젝트명 변화와 무관하게 같은 운영 볼륨을 사용한다. 배포 문서에는 볼륨 확인 명령과 init 로그 재출현 시 중지해야 한다는 경고를 추가한다.
|
||||
|
||||
@@ -13,6 +13,12 @@
|
||||
| app.vue | 공개 사이트 설정 기반 파비콘 head 링크, 페이지 제목이 있으면 제목만 쓰고 없으면 사이트 이름을 쓰는 title template, 브랜드 컬러 `--site-accent` 적용, 새 화면 렌더·BFCache 복귀 후 해제되는 불투명 전역 이동 로딩 오버레이 |
|
||||
| error.vue | 공개 404/서버 오류 화면, 홈 이동 버튼 |
|
||||
|
||||
## 공개 컴포넌트
|
||||
|
||||
| 파일 | 용도 |
|
||||
|------|------|
|
||||
| components/site/SiteHeader.vue | 공개 헤더, 검색 모달 열기, 좌측 메뉴 토글, 회원 메뉴 표시, owner/admin 회원의 `사이트 관리` 링크 |
|
||||
|
||||
## Composables
|
||||
|
||||
| 파일 | 용도 |
|
||||
@@ -99,6 +105,8 @@
|
||||
| lib/admin-pagination.js | 관리자 번호형 페이지네이션 페이지 보정·ellipsis 항목 계산 |
|
||||
| lib/csp-report.js | CSP 보고 Content-Type·32KB/20건 제한 상수, payload 검증, 문서 경로·차단 origin·브라우저 계열 최소화 |
|
||||
| server/utils/google-oauth.js | Google 로그인·계정 연동 OAuth 설정, state 서명·검증, 토큰 교환, 내부 redirect 보정 |
|
||||
| server/utils/admin-auth.js | 관리자 세션 쿠키 생성·검증·삭제 |
|
||||
| server/utils/member-auth.js | 회원 세션 쿠키 생성·검증·삭제 |
|
||||
| lib/site-route-transition.js | 공개 라우트 전환 베일 사용 여부와 query/hash 이동 제외, 스크롤 복원·최상단 이동 helper |
|
||||
| lib/media-catalog.js | 업로드 URL·저장 키 정규화, 미디어 종류·원본/파생 역할 판별, 콘텐츠 미디어 참조 추출, PostgreSQL LIKE 리터럴 이스케이프 |
|
||||
| lib/social-links.js | 사이트 설정 SNS 링크 아이콘 프리셋·사용자 SVG 정리·URL 자동 보정·레거시 JSON 문자열 복구·공개 노출 목록 생성 |
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
- `Escape` 키는 통합 검색 모달이 열려 있으면 최우선으로 닫고, 그다음 사용자 드롭다운, 이어서 모바일에서만 좌측 슬라이드 메뉴를 닫는다.
|
||||
- `/` 키는 `INPUT`·`TEXTAREA`·`SELECT`·`contenteditable`에 포커스가 없고 `Ctrl`/`Meta`/`Alt`와 함께 눌리지 않을 때 통합 검색 모달을 연다. 헤더 검색 영역(`md+`) 클릭으로도 동일하게 연다.
|
||||
- 통합 검색 입력은 한글 등 IME 조합 중에도 입력창에 표시되는 현재 값을 디바운스로 검색에 반영하고, 조합 종료 시 최종 입력값을 즉시 검색한다. 검색어는 앞뒤 공백 제거, 연속 공백 단일화, Unicode NFC 정규화를 거쳐 태그·게시물·페이지 검색에 사용한다.
|
||||
- 헤더 우측 사용자 아이콘 버튼은 로그인 상태면 회원 아바타/닉네임과 설정·로그아웃 메뉴를, 비로그인 상태면 Guest·Sign up·Sign in 메뉴를 표시한다. 회원 아바타 이미지가 없거나 비로그인 상태인 경우 사용자 메뉴 버튼에는 사람 아이콘을 표시한다.
|
||||
- 헤더 우측 사용자 아이콘 버튼은 로그인 상태면 회원 아바타/닉네임과 설정·로그아웃 메뉴를, 비로그인 상태면 Guest·Sign up·Sign in 메뉴를 표시한다. 로그인 회원이 owner/admin 권한이면 설정 위에 `사이트 관리` 링크를 표시해 `/admin`으로 이동한다. 회원 아바타 이미지가 없거나 비로그인 상태인 경우 사용자 메뉴 버튼에는 사람 아이콘을 표시한다.
|
||||
- 오른쪽 사이드바의 FOLLOW 영역은 사이트 설정의 SNS 링크 목록을 기준으로 표시한다. 관리자가 아이콘 프리셋 또는 직접 SVG 아이콘과 주소를 등록한 항목만 노출하며, 등록된 항목이 없으면 FOLLOW 영역 자체를 숨긴다. SNS 주소는 `https://`를 생략해도 저장 시 자동 보정한다. 관리자 편집 화면은 아이콘과 주소를 기본 입력으로 사용하며, 직접 SVG 프리셋을 선택했을 때만 SVG 코드 입력을 추가로 표시한다. 공개 FOLLOW 아이콘은 프리셋·직접 SVG 모두 16px 아이콘을 20px 버튼 중앙에 배치한다.
|
||||
|
||||
### 공개 화면 색상
|
||||
@@ -213,6 +213,7 @@
|
||||
- 인증 화면 상태 메시지는 오류/안내를 분리해 `aria-live`로 노출한다.
|
||||
- 회원가입 1단계의 타이틀/설명은 `GET /api/site-settings`의 `title`, `description` 값을 우선 사용한다.
|
||||
- 회원 세션 쿠키 서명에는 `MEMBER_SESSION_SECRET`만 사용하며, 관리자 비밀번호를 fallback으로 쓰지 않는다.
|
||||
- 공개 로그인으로 owner/admin 계정에 로그인하면 회원 세션과 함께 관리자 세션을 발급한다. 기존 공개 회원 세션만 남아 있는 owner/admin 계정도 `/admin` 진입 시 `/admin/api/auth/me` 조회에서 현재 권한과 세션 버전을 확인한 뒤 관리자 세션으로 승격한다. 공개 로그아웃은 회원 세션과 관리자 세션을 함께 삭제한다.
|
||||
- Google 로그인은 `/api/auth/google/start`에서 시작하고 `/api/auth/google/callback`에서 처리한다. 서버는 `GOOGLE_OAUTH_CLIENT_ID`, `GOOGLE_OAUTH_CLIENT_SECRET`, 선택값 `GOOGLE_OAUTH_REDIRECT_URI`를 사용하며, 값이 없으면 기존 AdSense OAuth 클라이언트 값(`GOOGLE_ADSENSE_CLIENT_ID`, `GOOGLE_ADSENSE_CLIENT_SECRET`)을 fallback으로 사용할 수 있다.
|
||||
- Google OAuth state는 `MEMBER_SESSION_SECRET` 기반 HMAC 서명과 10분 nonce 쿠키로 검증한다. redirect는 `/`로 시작하는 내부 경로만 허용한다.
|
||||
- 일반 회원 Google 로그인은 `google_sub`로 기존 회원을 찾고, 없으면 이메일 중복이 없을 때 새 회원을 생성한다. 이미 같은 이메일로 가입된 계정이 있으면 기존 계정 로그인 후 Google 계정 연결을 요청한다.
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# 업데이트 이력
|
||||
|
||||
## v1.12.17
|
||||
|
||||
- 공개 헤더 사용자 메뉴에 관리자 권한 회원용 `사이트 관리` 링크 추가.
|
||||
- 공개 관리자 계정 로그인 시 관리자 세션을 함께 발급하고, 기존 공개 세션만 있는 관리자도 `/admin` 진입 시 관리자 세션으로 승격하도록 수정.
|
||||
- 공개 로그아웃 시 관리자 세션도 함께 삭제하도록 정리.
|
||||
|
||||
## v1.12.16
|
||||
|
||||
- 운영 PostgreSQL 볼륨 이름을 `POSTGRES_VOLUME_NAME` 기본값 `soristudio_sori-studio-postgres`로 고정해 Compose 프로젝트명 변경 시 새 빈 DB 볼륨이 붙지 않도록 수정.
|
||||
|
||||
Reference in New Issue
Block a user