SCIM 을 이용한 사용자 추가

Gyosun
Snowflake Korea
Published in
6 min readApr 28, 2023

SCIM(교차 도메인 ID 관리 시스템)은 ID 도메인 또는 IT 시스템 간의 사용자 ID 정보 교환을 자동화하기 위한 표준입니다.

SNOWFLAKE내의 사용자와 패스워드는 SNOWSIGHT를 통해서 추가 / 삭제 /변경등이 가능합니다. 패스워드는 모두 암호화 되어서 저장 및 관리가 되며, MFA(Multi-factor 인증)을 통하여 추가적인 사용자 인증이 가능토록 합니다.

SNOWFLAKE 사용자에 대한 추가 및 권한 관리를 SNOWFLAKE 관리자가 수행할 수도 있지만, 엔터프라이즈 기업에서는 다양한 SNOWFLAKE의 사용자들이 입사 / 퇴직 / 보직 변경등으로 인하여 많은 변화를 가지게 되며, 이를 손쉽게 관리하기 위한 포털 / 혹은 사용자 관리 시스템을 가지게 됩니다.

이러한 사용자 관리 시스템을 직접 개발 및 운영하는 고객사는 해당 시스템과 SNOWFLAKE 간의 사용자 관리를 위한 인터페이스를 수행하게 되며, 이 때 업계 표준으로 자리잡고 있는 SCIM 인터페이스를 통해서 손쉽게 사용자 관리를 통합할 수 있습니다.

SCIM 연계를 위한 SNOWFLAKE 준비

먼저 커스텀 사용자 관리 시스템이 SNOWFLAKE와 SCIM 기반으로 인터페이스를 수행하기 위하여 Token 을 생성해 줍니다.

  1. SCIM 연계를 위한 INTEGRATION 생성

TYPE은 SCIM을 지정하며, SCIM_CLIENT는 GENERIC 을 지정합니다. RUN_AS_ROLE은 SCIM을 통해 사용자 관련 요청이 들어올 경우 수행될 SNOWFLAKE의 역할을 정의합니다.

2. SCIM 연계를 위한 토큰 생성

SNOWFLAKE가 제공하는 함수 GENERATE_SCIM_ACCESS_TOKEN을 통해 토큰을 생성합니다.

이 토큰은 생성일자를 기준으로 6개월 동안 유효하며, 6개월이 지나기 전에 재생성을 수행해줘야 합니다.

SCIM 연계 프로그램 개발

SCIM은 표준 HTTP/REST 기반으로 통신을 수행하기 때문에 추가적인 라이브러리 없이도 사용이 가능하며, 사용자는 SCIM 표준 스펙에 맞는 JSON 데이터를 사전에 정의된 SNOWFLAKE REST ENDPOINT로 전달함으로써, 손쉽게 사용자 추가 / 변경이 가능합니다.

 String scimToken = "ver:2-hint:185159701-did:1032-ETMsDgAAAYeNU1F<삭제>";


JSONObject jsonObject = new JSONObject();
jsonObject.put("userName","scim_user");
jsonObject.put("password","xxxxxyyyyyy");
jsonObject.put("displayName","test user");
jsonObject.put("active", true);

JSONObject name = new JSONObject();
name.put("givenName","gyosun");
name.put("familyName","lee");

jsonObject.put("name",name);
List<String> list = new ArrayList<String>();
list.add("my-email@xxxxyyyyy.com");

jsonObject.put("emails", list);

List<String> schemas = new ArrayList<String>();
schemas.add("urn:ietf:params:scim:schemas:core:2.0:User");
schemas.add("urn:ietf:params:scim:schemas:extension:enterprise:2.0:User");

jsonObject.put("schemas", schemas);

HttpClient httpClient = HttpClients.custom().build();
HttpGet httpPost = new HttpGet("https://<<URL>>.snowflakecomputing.com/scim/v2/Users");
httpPost.setHeader("Authorization", "Bearer " + scimToken);

위 코드에서 중요한 부분은 단 3가지 입니다.

  1. JSON 데이터를 만들 때, 사전에 정의되어 있는 포맷 형태로 만들어야 한다는 점입니다. 이는 사용자 추가 / 삭제 등에 따라 포맷이 다름을 의미하며, 아래의 링크를 통해서 관련 스펙을 확인 가능합니다.

2. HTTP 헤더에 Authorization영역에 SCIM 토큰 값을 설정합니다. 이를 통해서 해당 프로그램에 대한 인증이 수행될 수 있습니다.

3. 사용자 / 그룹(역할)에 따라 호출해야 하는 URL이 다릅니다. 이는 아래의 링크를 통해서 확인이 가능합니다.

위와 같이 간단한 Java 프로그램 개발을 통해서 표준 HTTP / REST 기반의 사용자 동기화를 위한 프로그램 개발을 수행할 수 있습니다.

감사합니다.

--

--