# 리소스(Resource) 정의

Keycloak에서 리소스는 보호 대상이 되는 엔티티를 추상화한 개념이다. API 엔드포인트, 정적 파일, 특정 기능, 데이터 집합 등 보호해야 할 모든 요소를 리소스로 정의할 수 있다. 권한 부여(Authorization) 기능은 이 리소스 정의를 기반으로 사용자나 클라이언트가 접근할 수 있는지 여부를 세밀하게 제어한다.

리소스는 다음과 같은 기본 요소들로 구성된다.

* **이름(Name)** 관리자가 식별하기 쉽도록 설정하는 리소스의 내부 식별자다. 사용자가 실제로 요청하는 경로나 기능 이름과 동일할 필요는 없지만, 관리 편의성과 가독성을 위해 명시적으로 작성하는 것이 좋다.
* **URI 경로(Uri)** 보호 대상 엔드포인트나 파일 경로를 지정한다. 여러 경로를 하나의 리소스로 묶을 수도 있으며, 와일드카드(\*) 표기를 통해 패턴 매칭으로 보호 범위를 지정할 수 있다.
* **스코프(Scope)** 리소스에서 수행될 수 있는 동작을 세분화한다. 예를 들어 `view`, `edit`, `delete`와 같이 명시적으로 동작을 구분해 두면, 동일한 리소스라도 어떤 스코프에 대한 접근을 허용할지를 독립적으로 설정할 수 있다.
* **소유자(Owner)** 리소스에 대한 기본 소유자 정보를 담는다. 일반적으로 애플리케이션(클라이언트) 자체가 소유자가 되거나, 실제 사용자 계정이 소유자가 될 수 있다. 소유자 정보는 정책(Permission) 설정 시 중요한 기준이 된다.
* **유형(Type)** 리소스의 카테고리를 분류하기 위한 용도로 사용한다. 예컨대 `urn:photo`, `urn:document`, `urn:api` 등으로 구분해두면, 정책 생성 시 특정 리소스 유형 전체에 일괄 권한을 부여하기 용이해진다.
* **리소스 속성(Attributes)** 추가 메타데이터를 포함하기 위해 임의의 속성을 key-value 형태로 저장할 수 있다. 정책 정의 시 이 속성을 조건으로 활용해 세부적인 접근 제어가 가능하다.

### 리소스 정의 방법

Keycloak에서 리소스를 정의하기 위해 다음 단계를 거친다.

1. **Keycloak 관리자 콘솔 접속** 보호하려는 애플리케이션(클라이언트)에 대한 설정 화면으로 이동한다. 해당 클라이언트의 “Authorization” 탭에서 “Resources” 섹션을 확인할 수 있다.
2. **새 리소스 생성** “Resources” 섹션에서 “Create Resource” 버튼을 클릭하여 새 리소스를 등록한다. 이때 이름, URI, 스코프, 소유자, 유형 등을 설정한다.
3. **추가 설정** 필요한 경우 “Attributes” 탭을 통해 커스텀 속성을 추가할 수 있다. 이후 정책(Policy)이나 권한(Permission)을 생성할 때 이 속성을 활용해 더 세밀한 규칙을 지정할 수 있다.

### 리소스와 정책의 연계

리소스가 정의되면 다음 단계인 정책 및 권한 설정에서 이를 참조해 접근 제어 로직을 구성한다. 예를 들어, 특정 URI를 리소스로 지정하고 해당 리소스에 `edit` 스코프가 설정되어 있다면, `edit` 스코프에 대한 정책을 별도로 정의하여 “편집” 기능에 대한 접근을 제한할 수 있다.

* **정책(Policy)** “어떤 조건일 때 접근을 허용/거부하는가?”를 정의한다. 역할(Role) 기반, 사용자 속성, 그룹(Group) 또는 커스텀 로직 등을 활용할 수 있다.
* **권한(Permission)** 특정 리소스와 연결된 정책을 실제로 작동하도록 묶는 개념이다. “어떤 리소스에 어떤 스코프를 허용하며, 그 조건은 무엇인가?”를 결정한다.

### 설계 시 고려 사항

* **리소스 분류 전략** 너무 많은 리소스를 개별적으로 설정하면 관리가 복잡해지고, 너무 적은 리소스를 사용하면 세부적인 제어가 어려울 수 있다. 공통 기능이나 동일한 접근 제어가 필요한 URI들을 묶어서 효율적으로 구성해야 한다.
* **스코프 범위 설정** “읽기/쓰기”와 같이 단순화된 스코프를 사용할 수도 있으나, 필요에 따라 “생성/조회/수정/삭제”처럼 더 세분화하는 편이 좋다. 스코프 설계가 섬세할수록 정책 정의가 유연해진다.
* **정책과 권한 확장성** 리소스 속성(Attributes)이나 유형(Type)을 활용하면, 신설되는 리소스나 기능에 대해서도 최소한의 변경만으로 확장 가능한 정책 체계를 유지할 수 있다.

Keycloak의 권한 부여 기능에서 리소스는 세분화된 접근 제어의 핵심 단위이다. 관리자 콘솔이나 API를 통해 정확하고 일관성 있게 리소스를 정의해야만, 이후 정책과 권한 구성이 명확해지며 유지보수 부담을 줄일 수 있다.
