본문 바로가기
Developer Advocacy

RFC 7643 한글 해설 2 - 리소스

by keynotion 2024. 7. 3.
반응형
이 문서는 RFC 7643을 이해하기 쉽도록 한글로 재작성한 것입니다. 한글 표현에 대한 다양한 의견 환영합니다.

들어가며

SCIM이란?

SCIM의 목적은 효율적인 프로비저닝이다. SCIM의 효용은 범용적인 프로비저닝 앱을 손쉽게 개발할 수 있다는 것인데, 실제로 각 IdP 및 SP 서비스를 살펴 보면 몇 가지 설정만으로 “프로비저닝 앱”을 제작할 수 있는 플랫폼이 제공된다.(예: Microsoft Entra ID, Okta 등)

이를 위해 각 IdP 및 SP 서비스는 SCIM 표준 스키마를 따르는 사용자 및 그룹 데이터베이스를 가정하여, 표준 프로토콜을 따르는 SCIM API를 사용하여 프로비저닝을 수행할 수 있도록 준비하기만 하면 된다.

 

 

이 문서는 RFC 7643 - System for Cross-domain Identity Management: Core Schema(2015-09)의 섹션 2~7을 한글로 번역하고 해설을 덧붙인 자료이다. 영어 원문이 궁금한 사람은 공식 홈페이지(링크) 문서를 참고하기 바란다.

이전 글 참고: RFC 7643 한글 해설 1 - 용어 및 스키마 설명


 

3. 리소스

각 SCIM 리소스는 다음 구성 요소를 가진 JSON 객체이다:

  • Resource Type
    • 모든 SCIM 리소스(또는 JSON 객체)는 리소스 유형을 가짐
    • 리소스 유형("meta.resourceType"; 3.1절 참조)에 따라, 다음 세 가지가 정의됨
    • 리소스의 핵심 속성 스키마, 그 외 모든 속성 확장 스키마, 뿐만 아니라 동일한 리소스 유형을 조회할 수 있는(MAY) 엔드포인트
    • 리소스에 대한 추가 정보는 리소스 유형 정의(6절 참조) 참조
  • "Schemas" Attribute
    • "schemas" 속성은 필수 속성
    • 현재 JSON 구조에 존재하는 속성을 정의하는 SCIM 스키마의 네임스페이스를 나타내는 URI를 포함하는 문자열 배열
    • 이 속성은 파서가 속성을 정의하는데에 사용될 수 있음: HTTP 요청 또는 응답의 본문 JSON 구조에 존재하는 속성을 정의하는데 사용
    • 각 문자열 값은 고유한 URI여야 함
    • SCIM 스키마의 모든 표현은 해당 표현에서 지원하는 URI의 값이 포함된 비어 있지 않은 배열을 포함해야 함(MUST)
    • 리소스에 대한 "schemas" 속성 값은 반드시 "schema" 및 "schemaExtensions"로 정의된 값만 포함해야 함(MUST) (리소스의 "resourceType"을 정의함에 따라)
    • 중복된 값은 포함되면 안 됨(MUST NOT)
    • 값의 순서는 지정되지 않으며 이것이 동작에 영향을 미쳐서는 안 됨(MUST NOT)
  • Common Attributes
    • 공통 속성은 모든 SCIM 리소스에 공통적으로 포함되는 속성 (JSON 본문에 존재하는 "schemas" 속성의 값에 관계없이)
    • 이 속성들은 특정한 스키마에 정의되어 있지는 않음
    • 그러나 모든 리소스에 존재한다고 가정되어야 함(SHALL) ("schemas" 속성의 값에 관계없이) (3.1절 참조)
  • Core Attributes
    • 핵심 속성은 (리소스 "id"와 같은 공통 속성과 함께) JSON 객체의 최상위에 위치하는 속성
    • 유효 속성의 목록은 리소스의 리소스 유형 "schema" 속성(6절 참조)에 의해 지정됨
    • 이 값은 또한 리소스의 "schemas" 속성에도 존재함
  • Extended Attributes
    • 확장 스키마 속성은 리소스의 리소스 유형 "schemaExtensions" 속성(6절 참조)에 의해 지정됨
    • 핵심 속성과 달리, 확장 속성은 스키마 확장 URI로 식별되는 자체 하위 속성 네임스페이스에 보관됨
    • 이는 별도의 스키마 확장으로 인해 발생할 수 있는 속성 이름 충돌을 방지함

 

 

다음 예제 "User"의 공통 속성과 핵심 속성은 아래와 같다. 일부 값은 명확성을 위해, 생략되었거나(…), 축약되거나, 공백이 추가되었다.

  • 공통 속성: "id", "externalId", 복합 속성 "meta"(하위 속성 "resourceType" 포함)
  • 핵심 속성: "userName", "name"
  • 확장된 기업 사용자 속성(extended enterprise User attributes): "employeeNumber" 및 "costCenter"(자체 스키마 URI로 식별되는 자체 JSON 하위 구조에 포함됨)
{
     "schemas":
       ["urn:ietf:params:scim:schemas:core:2.0:User",
         "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],

     "id": "2819c223-7f76-453a-413861904646",
     "externalId": "701984",

     "userName": "bjensen@example.com",
     "name": {
       "formatted": "Ms. Barbara J Jensen, III",
       "familyName": "Jensen",
       "givenName": "Barbara",
       "middleName": "Jane",
       "honorificPrefix": "Ms.",
       "honorificSuffix": "III"
     },
    ...

     "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
       "employeeNumber": "701984",
       "costCenter": "4130",
       ...
     },

     "meta": {
       "resourceType": "User",
       "created": "2010-01-23T04:56:22Z",
       "lastModified": "2011-05-13T04:42:34Z",
       "version": "W\\/\\"3694e05e9dff591\\"",
       "location":
         "<https://example.com/v2/Users/2819c223-7f76-453a-413861904646>"
     }
   }
}

 

3.1. 공통 속성

각 SCIM 리소스(사용자, 그룹 등)는 다음과 같은 공통 속성을 포함한다. 공통 속성은 모든 리소스(모든 확장된 리소스 타입 포함)에 대해 정의되어야 한다.(MUST) 여기서 모든 리소스라 함은 모든 확장된 리소스 타입을 포함하고, 서버 디스커버리 엔드포인트(및 그와 관련된 리소스)는 제외한다. (예: "ServiceProviderConfig" 및 "ResourceType")

서비스 제공자는 SCIM 생성 요청을 수락할 때, "id" 및 "meta"(및 그와 관련된 하위 속성) 속성 값을 할당해야 한다.(MUST) (서비스 제공자가 직접 지정하는 공통 속성 값이 있다는 의미)

공통 속성은 모든 기본 리소스 스키마의 일부로 간주된다. 자체 "schemas" URI를 사용하지 않는다.

하위 호환성을 위해, 일부 기존 스키마 정의는 스키마의 일부로 공통 속성을 나열할 수 있다.(MAY)

아래 나열된 속성 특성(2.2절 참조)은 기존 스키마에 포함될 수 있는 이전 정의보다 우선한다.(SHALL)

  • id: 서비스 제공자에 의해 정의된 SCIM 리소스의 고유 식별자
    • 각 리소스 표현은 비어있지 않은 "id" 값을 반드시 포함해야 함(MUST)
    • 이 식별자는 SCIM 서비스 제공자의 모든 리소스 집합에서 고유해야 함(MUST)
    • 이 식별자는 안정적이며, 재할당할 수 없는 식별자여야 하며, 동일한 리소스가 후속 요청에서 반환될 때 변경되지 않아야 함(MUST)
    • "id" 속성의 값은 항상 서비스 제공자에 의해 발급되며 클라이언트에 의해 지정되어서는 안됨(MUST NOT)
    • 문자열 "bulkId"는 예약된 키워드이며 어떠한 고유 식별자 값 내에서도 사용되어서는 안됨(MUST NOT)
    • 속성 특성
      • "caseExact" as "true"
      • mutability of "readOnly"
      • "returned" 특성은 "always"
    • 개인정보와 관련한 추가 고려사항은 9절 참조
  • externalId: 프로비저닝 클라이언트에 의해 정의된 리소스의 식별자
    • "externalId"는 클라이언트 입장에서 프로비저닝 도메인의 식별자를 필터로 하여 리소스를 찾을 때 사용함
    • 이를 통해, 프로비저닝 도메인의 리소스 식별자와 서비스 제공자의 식별자 간 로컬 매핑을 저장하지 않을 수 있도록 도움을 줌
    • 각 리소스의 "externalId" 값은 비어있지 않음(MAY)
    • "externalId" 속성의 값은 항상 프로비저닝 클라이언트에 의해 발급됨
    • 서비스 제공자에 의해 지정되어서는 안 됨(MUST NOT)
    • 서비스 제공자는 항상 externalId를 프로비저닝 도메인에 한정된 것으로 해석해야 함(MUST)
    • 서버는 고유성을 강제하지 않지만, 값의 고유성은 값을 설정하는 클라이언트에 의해 제어된다고 가정함
    • 개인정보와 관련한 추가 고려사항은 9절 참조
    • 속성 특성
      • "caseExact" as "true"
      • mutability of "readWrite"
      • OPTIONAL
  • meta: 리소스의 메타데이터를 담고 있는 복합 속성(다음의 하위 속성들을 포함함):
    • "meta" 속성에 대한 모든 하위 속성은 서비스 제공자에 의해 할당됨
      • mutability of "readOnly"
      • 모든 하위 속성의 "returned" 특성은 "default"
      • 클라이언트는 이 속성을 무시하여 제공할 수 있음(SHALL)
    • resourceType: 리소스의 리소스 유형 이름
      • mutability of "readOnly"
      • "caseExact" as "true"
    • created: 리소스가 서비스 제공자 측에 추가된 시점(DateTime)
      • 이 속성은 반드시 DateTime이어야 함(MUST)
    • lastModified: 서비스 제공자 측에 마지막으로 리소스가 수정된 시점(DateTime)
      • 리소스 생성 이후 수정된 적이 없다면 이 값은 "created" 값과 동일해야 함(MUST)
    • location: 반환되는 리소스의 URI
      • "Content-Location" HTTP response header([RFC7231]의 3.1.4.2절 참조)와 동일해야 함(MUST)
    • version: 반환되는 리소스의 버전
      • "ETag(entity-tag)" HTTP response header([RFC7232]의 2.1 및 2.3절 참조)와 동일해야 함
      • "caseExact" as "true"
      • 서비스 제공자의 버전 관리 지원 여부에 따라, 버전 지원은 선택적으로 할 수 있음([RFC7644]의 3.14절 참조)
      • 서비스 제공자가 표현을 위한 "version" (entity-tag)을 제공하고 해당 entity-tag의 생성이 강력 검증자의 모든 특성을 만족시키지 않는 경우([RFC7232]의 2.1절 참조), 원 서버는 그것의 불투명 값 앞에 "W/"(대소문자 구분)를 접두사로 붙여 "version" (entity-tag)을 약한 것으로 표시해야 함

 

3.2. 신규 리소스 유형 정의하기

새로운 SCIM 리소스 클래스를 정의하여 확장 사용하기 위해 리소스 유형을 정의한다.

리소스 유형은 다음 네 가지를 정의한다: 이름, 엔드포인트, 기본 스키마(속성), 그 외 모든 확장 스키마

새로운 유형의 리소스를 제공하기 위해, 서비스 제공자는 6절에 명시된 대로 새 리소스 유형을 정의하고 스키마 표현(8.7절 참조)을 정의한다.

 

3.3. 리소스에 대한 확장 속성

SCIM은 리소스 유형에 대한 핵심 스키마에서, 더 확장된 속성을 가질 수 있다. 이는 LDAP[RFC4512]에서 "objectClasses"가 사용되는 방식과 유사하다. 그러나 LDAP과 달리 상속 모델이 없으며, 모든 확장은 추가적이다(LDAP 보조 객체 클래스와 유사).

"schemas" 속성의 각 값은 SCIM 리소스 표현에 존재할 수 있는(MAY) 스키마를 누적적으로 표시한다.

"schemas" 속성은 최소 하나의 값(MUST), 즉 리소스의 기본 스키마를 포함(SHALL)해야 한다.

"schemas" 속성은 사용 중인 확장 스키마를 포함(MAY)할 수 있다.

스키마 확장은 이 문서에 정의된 속성을 재정의할 수 없으며(SHOULD), 이 문서의 관례를 따라야 한다.(SHOULD)

기본 객체 스키마를 제외한 그 외 스키마 확장 URI는 확장 네임스페이스에 담긴 속성을 기본 스키마 속성과 구별하기 위한 JSON 컨테이너로 사용되어야 한다.(SHALL)

그림 5는 엔터프라이즈 사용자의 JSON 표현 예시이며, 확장된 스키마를 가진 사용자의 예시로도 볼 수 있다.

리소스가 주어졌을 때 해당 리소스의 "schemas" 속성 값 중, 어느 URI 값이 기본 스키마이고 어느 것이 확장된 스키마인지 결정하려면, 해당 리소스의 "resourceType" 속성 값을 사용하여 리소스의 리소스 유형 스키마를 검색하여 알아볼 수(MAY) 있다.(제 6절 참조). (그림 8의 "ResourceType" 표현을 예시로 참조)

 

[그림 5]

{
  "schemas":
    ["urn:ietf:params:scim:schemas:core:2.0:User",
      "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],
  "id": "2819c223-7f76-453a-919d-413861904646",
  "externalId": "701984",
  "userName": "bjensen@example.com",
  "name": {
    "formatted": "Ms. Barbara J Jensen, III",
    "familyName": "Jensen",
    "givenName": "Barbara",
    "middleName": "Jane",
    "honorificPrefix": "Ms.",
    "honorificSuffix": "III"
  },
  "displayName": "Babs Jensen",
  "nickName": "Babs",
  "profileUrl": "<https://login.example.com/bjensen>",
  "emails": [
    {
      "value": "bjensen@example.com",
      "type": "work",
      "primary": true
    },
    {
      "value": "babs@jensen.org",
      "type": "home"
    }
  ],
  "addresses": [
    {
      "streetAddress": "100 Universal City Plaza",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "100 Universal City Plaza\\nHollywood, CA 91608 USA",
      "type": "work",
      "primary": true
    },
    {
      "streetAddress": "456 Hollywood Blvd",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "456 Hollywood Blvd\\nHollywood, CA 91608 USA",
      "type": "home"
     }
  ],
  "phoneNumbers": [
    {
      "value": "555-555-5555",
      "type": "work"
    },
    {
      "value": "555-555-4444",
      "type": "mobile"
    }
  ],
  "ims": [
    {
      "value": "someaimhandle",
      "type": "aim"
    }
  ],
  "photos": [
    {
      "value":
        "<https://photos.example.com/profilephoto/72930000000Ccne/F>",
      "type": "photo"
    },
    {
      "value":
        "<https://photos.example.com/profilephoto/72930000000Ccne/T>",
      "type": "thumbnail"
    }
  ],
  "userType": "Employee",
  "title": "Tour Guide",
  "preferredLanguage": "en-US",
  "locale": "en-US",
  "timezone": "America/Los_Angeles",
  "active":true,
  "password": "t1meMa$heen",
  "groups": [
    {
      "value": "e9e30dba-f08f-4109-8486-d5c6a331660a",
      "$ref": "../Groups/e9e30dba-f08f-4109-8486-d5c6a331660a",
      "display": "Tour Guides"
    },
    {
      "value": "fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "$ref": "../Groups/fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "display": "Employees"
    },
    {
      "value": "71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "$ref": "../Groups/71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "display": "US Employees"
    }
  ],
  "x509Certificates": [
    {
      "value":
       "MIIDQzCCAqygAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMx
        EzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAoMC2V4YW1wbGUuY29tMRQwEgYD
        VQQDDAtleGFtcGxlLmNvbTAeFw0xMTEwMjIwNjI0MzFaFw0xMjEwMDQwNjI0MzFa
        MH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQKDAtl
        eGFtcGxlLmNvbTEhMB8GA1UEAwwYTXMuIEJhcmJhcmEgSiBKZW5zZW4gSUlJMSIw
        IAYJKoZIhvcNAQkBFhNiamVuc2VuQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
        AQEFAAOCAQ8AMIIBCgKCAQEA7Kr+Dcds/JQ5GwejJFcBIP682X3xpjis56AK02bc
        1FLgzdLI8auoR+cC9/Vrh5t66HkQIOdA4unHh0AaZ4xL5PhVbXIPMB5vAPKpzz5i
        PSi8xO8SL7I7SDhcBVJhqVqr3HgllEG6UClDdHO7nkLuwXq8HcISKkbT5WFTVfFZ
        zidPl8HZ7DhXkZIRtJwBweq4bvm3hM1Os7UQH05ZS6cVDgweKNwdLLrT51ikSQG3
        DYrl+ft781UQRIqxgwqCfXEuDiinPh0kkvIi5jivVu1Z9QiwlYEdRbLJ4zJQBmDr
        SGTMYn4lRc2HgHO4DqB/bnMVorHB0CC6AV1QoFK4GPe1LwIDAQABo3sweTAJBgNV
        HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
        Y2F0ZTAdBgNVHQ4EFgQU8pD0U0vsZIsaA16lL8En8bx0F/gwHwYDVR0jBBgwFoAU
        dGeKitcaF7gnzsNwDx708kqaVt0wDQYJKoZIhvcNAQEFBQADgYEAA81SsFnOdYJt
        Ng5Tcq+/ByEDrBgnusx0jloUhByPMEVkoMZ3J7j1ZgI8rAbOkNngX8+pKfTiDz1R
        C4+dx8oU6Za+4NJXUjlL5CvV6BEYb1+QAEJwitTVvxB/A67g42/vzgAtoRUeDov1
        +GFiBZ+GNF/cAYKcMtGcrs2i97ZkJMo="
    }
  ],
  "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
    "employeeNumber": "701984",
    "costCenter": "4130",
    "organization": "Universal Studios",
    "division": "Theme Park",
    "department": "Tour Operations",
    "manager": {
      "value": "26118915-6090-4610-87e4-49d8ca9f808d",
      "$ref": "../Users/26118915-6090-4610-87e4-49d8ca9f808d",
      "displayName": "John Smith"
    }
  },
  "meta": {
    "resourceType": "User",
    "created": "2010-01-23T04:56:22Z",
    "lastModified": "2011-05-13T04:42:34Z",
    "version": "W\\/\\"3694e05e9dff591\\"",
    "location":
"<https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646>"
  }
}

 

[그림 8]

[
  {
    "schemas": [
      "urn:ietf:params:scim:schemas:core:2.0:ResourceType"
    ],
    "id": "User",
    "name": "User",
    "endpoint": "/Users",
    "description": "User Account",
    "schema": "urn:ietf:params:scim:schemas:core:2.0:User",
    "schemaExtensions": [
      {
        "schema": "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User",
        "required": true
      }
    ],
    "meta": {
      "location": "<https://example.com/v2/ResourceTypes/User>",
      "resourceType": "ResourceType"
    }
  },
  {
    "schemas": [
      "urn:ietf:params:scim:schemas:core:2.0:ResourceType"
    ],
    "id": "Group",
    "name": "Group",
    "endpoint": "/Groups",
    "description": "Group",
    "schema": "urn:ietf:params:scim:schemas:core:2.0:Group",
    "meta": {
      "location": "<https://example.com/v2/ResourceTypes/Group>",
      "resourceType": "ResourceType"
    }
  }
]

 


이 문서는 RFC 7643을 이해하기 쉽도록 한글로 재작성한 것입니다. 한글 표현에 대한 다양한 의견 환영합니다. 보다 정확한 내용이 궁금하신 분들은 원문(링크)을 참고 부탁드려요.

댓글