UI 숨김과 별개로 서버 작업 경계에서 권한을 확인합니다.
Server Component, Server Action, Route Handler에서 실제 세션과 대상 리소스를 기준으로 권한을 검사합니다. 버튼을 숨기는 것은 UX일 뿐 보안 통제가 아닙니다.
인증은 사용자 식별, 인가는 해당 작업 허용 여부이며 둘을 분리합니다.
조직 id 같은 범위 조건을 DB 조회에도 포함해 다른 테넌트 데이터가 조회되지 않게 합니다.
클라이언트가 보낸 role과 ownerId를 신뢰하지 마세요.
로컬 프로젝트에서 확인해보세요member가 publish를 요청하면 FORBIDDEN을 반환하도록 정책을 추가하세요.
function canEdit(user, course) {
return user.role === "admin" || course.ownerId === user.id;
}
export default function Page() {
const user = { id: 7, role: "member" };
const course = { ownerId: 7, title: "Next.js" };
const allowed = canEdit(user, course);
return (
<main>
<h1>{course.title}</h1>
<p>{allowed ? "편집 가능" : "읽기 전용"}</p>
{allowed && <button>편집</button>}
</main>
);
}