콘텐츠를 불러오는 중입니다.
Project 댓글, 관리자 목록 검색·정렬, Tech Radar 자동 분류·확인창, 방문 통계, 커스텀 도메인 연결과 DB 함수 권한 최소화·회귀 수정까지 10차 이후 작업 기록
10차(다크 모드·댓글·관리자 UI 보안 정리)까지는 Log에만 댓글이 있었고, 관리자 목록은 검색·정렬 기능이 없어 항목이 늘어날수록 찾기 어려웠습니다. Tech Radar는 글을 모아오기만 할 뿐 분류가 없었고, 조회수는 새로고침마다 계속 올라갔습니다. 커스텀 도메인도 아직 연결 전이었고, 관리자 판별 함수는 로그인 안 한 사용자도 직접 실행할 수 있는 상태였습니다.
10차 이후 이어진 작업을 정리해 하나의 기록으로 남기고, 그 과정에서 발견한 보안 회귀(권한 관련 500 오류)까지 함께 정리하기로 했습니다.
가장 최근에 발견한 문제는 보안 강화 작업의 부작용이었습니다. 운영 DB를 직접 조회해보니 관리자 판별 함수 is_admin()을 로그인하지 않은 익명 사용자도 실행할 수 있는 상태였습니다. 이를 막기 위해 익명 실행 권한을 회수했는데, Log·Project의 공개 댓글 조회 정책이 같은 정책 안에서 is_admin()을 함께 호출하고 있었던 것을 놓쳤습니다. 정책 하나에 함수 호출이 섞여 있으면, 그 정책이 적용되는 역할(익명 포함) 전체가 함수 실행 권한을 필요로 한다는 점을 확인 없이 넘어간 것이 원인이었습니다. 결과적으로 로그인하지 않은 방문자가 Log·Project 상세를 열면 댓글을 불러오는 시점에 권한 오류가 나며 페이지 전체가 500으로 떨어졌습니다.
project_comments, RLS, 작성/수정/소프트 삭제/관리자 복구)을 Log 댓글과 같은 구조로 추가react-day-picker 기반 한국어 날짜 범위 선택기, 공통 로딩 스켈레톤, 저장 완료 알림build-learn.co.kr 커스텀 도메인 연결, 대표 주소 canonical 지정, Search Console 소유권 확인is_admin(), create_default_user_role()의 불필요한 익명(anon) 실행 권한 회수, 조회수 함수 search_path 강화Asia/Seoul로 통일update_modified_column()관리자 목록 검색·정렬은 콘텐츠가 늘어날수록 없으면 안 되는 기능이라, 화면마다 개별로 만들지 않고 같은 GET URL 파라미터 패턴(검색어·상태·기간·정렬)을 재사용해 필터 조합이 새로고침·공유에도 유지되게 했습니다. 조회수는 서버 렌더링 시점에 무조건 올리는 대신 화면에 실제로 보인 뒤 클라이언트가 요청하고, 같은 글은 24시간 동안 한 번만 세도록 해 실제 읽음에 더 가깝게 만들었습니다.
권한을 최소화하는 작업은 "누가 이 함수를 실행할 수 있는가"만 보는 게 아니라, "이 함수를 호출하는 다른 정책이 있는가"까지 함께 확인해야 안전합니다.
권한 회수 자체는 필요한 조치였지만, 그 함수를 호출하는 다른 정책까지 한 번에 점검하지 않아 회귀가 생겼습니다. 이후로는 함수 권한을 바꿀 때 pg_policies에서 그 함수를 참조하는 모든 정책과 적용 역할(anon 포함 여부)을 먼저 조회하고 바꾸는 순서로 진행합니다.
권한을 바꾼 뒤에는 실제로 그 역할로 쿼리가 되는지 트랜잭션 안에서 set local role anon처럼 역할을 바꿔 실행해보고 롤백하면, 운영 데이터를 건드리지 않고도 회귀 여부를 바로 확인할 수 있습니다.
npm run lintnpm run type-checknpm run format:checknpm run buildanon 역할로 Log·Project 댓글 조회, 조회수 증가 RPC가 오류 없이 실행되는지 확인anon이 is_admin()을 여전히 호출할 수 없는지(의도한 보안 유지) 확인user_roles에 member가 자동 생성되는지(트리거) 시뮬레이션으로 확인npm run dev 로컬 환경에서 Log/Project 상세를 직접 열어 회귀가 재현되지 않는지 확인supabase/migrations/20260930090000_harden_function_permissions.sqlsupabase/migrations/20260930230525_split_public_and_admin_comment_read_policies.sqlsrc/app/admin/tech-radar/page.tsxsrc/app/admin/tech-radar/CollectButton.tsxsrc/app/admin/tech-radar/ClassifyButton.tsxsrc/app/admin/tech-radar/DigestButton.tsxsrc/styles/globals.csssrc/app/admin/visits/page.tsx로컬 개발 서버 실행 권한이 막혀 있어 Tech Radar 화면 변경과 확인창을 실제 브라우저로 아직 확인하지 못했습니다. 다크 모드에서 Log 목록의 검색 버튼이 배경과 구분되지 않는 문제를 발견해, 전체 화면의 다크 모드 대비를 다음 작업에서 점검합니다.
다크 모드 색상 대비를 전체 화면에서 점검하고, 로컬 마이그레이션 파일과 운영 DB 이력이 어긋난 부분을 별도로 정리합니다.
댓글 0개
아직 댓글이 없습니다. 첫 댓글을 남겨보세요.
로그인 후 학습 기록에 댓글을 남길 수 있습니다.