주:
- 이 자습서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 예제 값을 사용합니다. 실습을 완료했으면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체하십시오.
OCI IAM 도메인에서 발행된 JWT 토큰을 사용하여 ORDS의 보호된 리소스에 액세스
소개
Oracle Cloud Infrastructure Identity and Access Management(OCI IAM)는 ID 도메인을 사용하여 인증, SSO(Single Sign-On), OCI용 ID 수명 주기 관리, SaaS, 클라우드 호스팅, 온프레미스 등 Oracle 및 비Oracle 애플리케이션에 대한 ID 및 액세스 관리 기능을 제공합니다.
Oracle REST Data Services(ORDS)는 HTTPS와 Oracle Database를 연결합니다. 중간 계층 Java 애플리케이션인 ORDS는 데이터베이스 관리 REST API, SQL Developer Web, PL/SQL Gateway, REST용 SODA(Simple Oracle Document Access) 및 Oracle Database의 데이터 및 내장 프로시저와 상호 작용하기 위해 RESTful 웹 서비스를 게시하는 기능을 제공합니다.
ORDS 릴리스 23.3에는 JWT(JSON 웹 토큰)에 대한 지원이 도입되었습니다. 이러한 Bearer 토큰을 사용하면 ORDS 개발자가 인증 및 권한 부여를 OAuth2 호환 ID 제공자(IdP)에 위임하여 ORDS가 ORDS 보호 리소스에 대한 액세스를 제공하기 위해 검증할 수 있는 JWT 액세스 토큰을 실행할 수 있습니다.
이 사용지침서에서는 OCI IAM 도메인에서 발행한 JWT 토큰을 사용하여 ORDS에서 보호된 리소스에 액세스하는 방법을 보여줍니다. 이 데모에서는 사전 구성된 완전 관리형 ORDS 애플리케이션과 함께 제공되는 OCI의 Oracle Autonomous Database를 사용합니다.
다음 이미지는 솔루션 아키텍처의 상위 레벨 표현을 보여줍니다.
목표
- OCI IAM 도메인에서 발행한 JWT 토큰을 사용하여 ORDS에서 보호된 리소스에 액세스합니다.
필요 조건
-
OCI 사용자는 Oracle Autonomous Databases 및 OCI IAM 도메인을 관리하는 데 필요한 정책이 있어야 합니다. 모든 서비스의 정책 참조에 대한 자세한 내용은 정책 참조를 참조하십시오.
-
Oracle Autonomous Database를 사용할 수 있어야 합니다. 자세한 내용은 Provision an Autonomous Database Instance을 참조하십시오.
-
ORDS가 JWT를 사용하여 인증 및 권한 부여를 수락하기 전에 다음을 수행합니다.
-
OAuth2 호환 IdP(예: ID 도메인이 있는 OCI IAM, Auth0)은 ORDS 리소스에 액세스할 수 있는 사용자에 대해 JWT를 실행하도록 이미 설정되어 있어야 합니다.
-
권한 부여 정책에서 사용자 정의 클레임을 사용하려면 IdP가 발행하는 JWT에 사용자 정의 클레임을 추가하도록 설정되어야 합니다.
-
-
발행 IdP에서 제공한 해당 퍼블릭 확인 키를 사용하여 JWT를 검증하려면 다음과 같이 하십시오.
-
서명 알고리즘은
RS256
,RS384
또는RS512
여야 합니다. -
공개 확인 키는 2048비트 이상이어야 하며 4096비트를 초과하면 안됩니다.
-
퍼블릭 확인 키는 JWK(JSON 웹 키) 형식으로 지정되고 인증 없이 ORDS에서 액세스할 수 있어야 합니다.
-
-
JWK URI 요구 사항:
-
JWK URI는 ORDS에서 액세스할 수 있어야 합니다.
-
JWT 서명을 확인하려면 JWKS에 키 매개변수가 있어야 합니다.
-
기본적으로 JWKS의 크기는 최대 10,000바이트일 수 있습니다.
-
주: OCI IAM 도메인과 이 도메인에서 발행된 JWT 토큰은 위의 모든 요구사항을 충족합니다.
작업 1: 데이터베이스 스키마에 대한 ORDS 설정, API 끝점 정의 및 액세스 제어 구성
-
OCI 콘솔에 로그인하고 Oracle Database로 이동한 후 Autonomous Database를 누릅니다.
-
프로비전된 Autonomous Database 인스턴스, 데이터베이스 작업을 누른 다음 SQL을 누릅니다.
-
다음 query를 실행하여 JWT를 지원하는 ORDS 버전 23.3 이상이 있는지 확인합니다.
SELECT * FROM ORDS_METADATA.ORDS_VERSION;
-
다음 질의를 실행하여 사용자(
ordstest
)를 생성하고 필요한 권한을 지정합니다.CREATE USER ordstest IDENTIFIED BY "<Password>"; GRANT CONNECT, RESOURCE TO ordstest; ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
-
스키마에 대해 ORDS를 사용으로 설정하여 REST API 기능을 허용하려면 다음 질의를 실행합니다.
BEGIN ORDS_ADMIN.ENABLE_SCHEMA( p_enabled => TRUE, p_schema => 'ordstest', p_url_mapping_type => 'BASE_PATH', p_url_mapping_pattern => 'ordstest', p_auto_rest_auth=> FALSE ); commit; END; /
-
다음 질의를 실행하여
ordstest
스키마에emp
라는 테이블을 생성하고 샘플 데이터를 삽입합니다.CREATE TABLE ordstest.emp ( EMPNO NUMBER(4,0), ENAME VARCHAR2(10 BYTE), JOB VARCHAR2(9 BYTE), MGR NUMBER(4,0), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2,0), CONSTRAINT PK_EMP PRIMARY KEY (EMPNO) );
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20); Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
-
다음 질의를 실행하여 API 끝점을 포함할 ORDS 모듈(
demo
)을 정의합니다.BEGIN ORDS_ADMIN.DEFINE_MODULE( p_schema => 'ordstest', p_module_name => 'demo', p_base_path => '/demo/', p_items_per_page=> 1000, p_status => 'PUBLISHED', p_comments=> '' ); COMMIT; END; /
-
다음 질의를 실행하여 특정 REST 리소스에 매핑되는 템플리트
emp
를 정의합니다.BEGIN ORDS_ADMIN.DEFINE_TEMPLATE( p_schema => 'ordstest', p_module_name => 'demo', p_pattern => 'emp', p_priority => 0, p_etag_type => 'HASH', p_comments => '' ); COMMIT; END; /
-
다음 질의를 실행하여
emp
에 대한 GET 요청 처리기를 생성합니다. 이 처리기는emp
테이블에서 데이터를 반환하는 간단한 SQL 질의를 실행합니다.BEGIN ORDS_ADMIN.DEFINE_HANDLER( p_schema => 'ordstest', p_module_name => 'demo', p_pattern => 'emp', p_method => 'GET', p_source_type => ords.source_type_collection_feed, p_source => 'select * from emp', p_items_per_page => 25, p_comments => '' ); COMMIT; END; /
emp
테이블은 도구 구성에서 사용 가능한 Oracle Autonomous Database의 ORDS 퍼블릭 액세스 URL에/ordstest/demo/emp
를 추가하여 인증 없이 볼 수 있습니다. Postman은 이 튜토리얼에서 사용됩니다. -
다음 질의를 실행하여
demo
모듈을 보호하기 위한 권한(privilegetest
)을 정의합니다.DECLARE L_PRIV_ROLES owa.vc_arr; L_PRIV_PATTERNS owa.vc_arr; L_PRIV_MODULES owa.vc_arr; BEGIN L_PRIV_MODULES( 1 ) := 'demo'; ORDS_ADMIN.DEFINE_PRIVILEGE( P_Schema=> 'ordstest', P_PRIVILEGE_NAME => 'privilegetest', P_ROLES => L_PRIV_ROLES, P_PATTERNS => L_PRIV_PATTERNS, P_MODULES => L_PRIV_MODULES, P_LABEL => 'privilegetest', P_DESCRIPTION => 'Demonstrate controlling access with priviliges', P_COMMENTS=> '' ); COMMIT; END; /
demo
모듈은privilegetest
권한으로 보호되므로 적절한 권한 부여 없이 액세스할 수 없습니다. 액세스를 사용으로 설정하려면ordstest
스키마에 대한 JWT 프로파일을 생성해야 합니다. 이를 통해 ORDS는 JWT Bearer 토큰을 검증하고 데모 모듈과 같은 보호된 리소스에 대한 액세스 권한을 부여할 수 있습니다.
작업 2: ORDS JWT 프로파일 생성
OAUTH.CREATE_JWT_PROFILE
프로시저를 사용하여 REST 사용 스키마 내에서 JWT 프로파일을 생성할 수 있습니다. 그러나 스키마당 하나의 JWT 프로파일만 정의할 수 있습니다. 기존 JWT 프로파일을 업데이트하려면 새로 생성하기 전에 먼저 해당 프로파일을 삭제해야 합니다.
BEGIN
OAUTH_ADMIN.DELETE_JWT_PROFILE(p_schema=>'ordstest');
OAUTH_ADMIN.CREATE_JWT_PROFILE(
p_schema => 'ordstest',
p_issuer => 'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com',
p_audience => 'ords/ordstest/',
p_jwk_url =>'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com:443/admin/v1/SigningCert/jwk'
);
COMMIT;
END;
/
이 JWT 프로파일은 발행자, 대상자 및 JWK URL을 지정합니다.
p_issuer
는 널이 아닌 값이어야 하며 JWT 지급자 토큰의iss
클레임과 일치해야 합니다.p_audience
는 널이 아닌 값이어야 하며 JWT 지급자 토큰의aud
클레임과 일치해야 합니다.p_jwk_url
는https://
로 시작하는 널이 아닌 값이어야 하며 권한 부여 서버가 제공한 퍼블릭 확인 키를 JWK(JSON 웹 키) 형식으로 식별해야 합니다.
OCI IAM 도메인에 대한 Issuer
및 JWK URI
은 다음 이미지와 같이 GET 요청을 OCI IAM 도메인 URL에 전송하고 /.well-known/openid-configuration
를 추가하여 얻을 수 있습니다.
JWT 프로파일 구성을 확인하려면 ordstest
사용자로 로그인하여 다음 SQL 질의를 실행합니다.
SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;
이 질의는 JWT 프로파일 세부정보를 검색하여 발행자, 대상자 및 JWK URL이 올바르게 구성되었는지 확인합니다.
JWT 프로파일이 구성되면 일반 사용자는 JWT 프로파일에 지정된 OCI IAM 도메인과 같이 OAuth 2.0 호환 IdP에서 발행한 JWT 토큰을 제공하여 ORDS 보호 리소스에 액세스할 수 있습니다. JWT 지급자 토큰이 성공적으로 검증되면 ORDS에서 다음을 수락합니다.
-
JWT 주체 클레임이 요청을 수행하는 인증된 사용자입니다.
-
JWT 범위는 사용자가 대신 권한을 사용하여 애플리케이션에 동의한 REST 사용 스키마 ORDS 권한으로 주장합니다.
작업 3: 인증 없이 OCI IAM 도메인 서명 인증서에 대한 ORDS 액세스 사용
-
OCI 콘솔로 이동하여 ID 및 보안, ID로 이동하고 도메인을 누릅니다.
-
작업할 ID 도메인의 이름을 누릅니다. 원하는 도메인을 찾기 위해 구획을 변경해야 할 수 있습니다. 설정 및 도메인 설정을 누릅니다.
-
서명 인증서 액세스 섹션에서 클라이언트 액세스 구성을 선택하고 변경 사항 저장을 누릅니다. 그러면 ORDS가 인증 없이 ID 도메인에 대한 서명 인증에 액세스할 수 있습니다.
작업 4: 리소스 서버 및 클라이언트, JWT 범위 및 ORDS 권한 구성
필요한 ORDS 권한과 일치하는 범위로 JWT를 실행하도록 IdP를 구성해야 합니다. ORDS의 리소스가 권한으로 보호되는 경우 해당 권한 이름을 범위로 정의해야 합니다. 이 범위를 사용하면 응용 프로그램이 사용자를 대신하여 액세스를 요청할 수 있습니다. 그런 다음 발행된 JWT는 범위를 클레임으로 포함해야 합니다. OCI IAM OAuth2 서비스를 사용하여 권한 부여를 시행하므로 일부 리소스 서버 및 클라이언트를 설정해야 합니다.
작업 4.1: 원하는 대상자 및 범위를 사용하여 리소스 서버 유형의 기밀 응용 프로그램 만들기
-
작업 중인 ID 도메인으로 이동하고 통합된 애플리케이션을 누릅니다.
-
애플리케이션 추가, 기밀 애플리케이션을 선택하고 워크플로우 실행을 누릅니다.
-
애플리케이션에 대한 이름(예:
ORDS-SERVER
)을 입력하고 다음을 누릅니다. -
리소스 서버 구성 섹션에서 지금 이 애플리케이션을 리소스 서버로 구성을 선택합니다.
-
JWT 프로파일과 일치하는 기본 대상자 및 ORDS 권한과 일치하는 범위를 사용하여 리소스 서버를 구성합니다.
-
다음 및 완료를 누릅니다.
-
애플리케이션 개요 페이지에서 활성화를 선택하고 애플리케이션을 활성화할지 확인합니다. 기밀 애플리케이션이 활성화됩니다.
작업 4.2: 원하는 범위가 지정된 클라이언트 유형의 기밀 응용 프로그램 만들기
-
작업 중인 ID 도메인으로 이동하고 통합된 애플리케이션을 누릅니다.
-
애플리케이션 추가, 기밀 애플리케이션을 선택하고 워크플로우 실행을 누릅니다.
-
애플리케이션에 대한 이름(예:
ORDS-CLIENT
)을 입력하고 다음을 누릅니다. -
클라이언트 구성 섹션에서 지금 이 애플리케이션을 클라이언트로 구성을 선택합니다.
-
승인 섹션에서 클라이언트 인증서를 선택합니다.
주: 이 자습서에서는 클라이언트 인증서를 권한 부여 유형으로 사용하고 있습니다. 요구사항에 따라 다른 권한 부여 유형(예: 사용자 관련 클라이언트에 대한 권한 부여 코드 플로우)을 선택할 수 있습니다.
-
클라이언트 유형에서 기밀을 선택합니다.
-
토큰 발행 정책 섹션에서 특정을 권한이 부여된 리소스로 선택합니다.
-
리소스 추가를 누르고 리소스에서 범위 추가를 선택합니다. 작업 4.1에서 만든 리소스 서버에 대해 원하는 범위를 선택합니다. 예:
privilegetest
. -
다음 및 완료를 누릅니다.
-
애플리케이션 개요 페이지에서 활성화를 선택하고 애플리케이션을 활성화할지 확인합니다. 기밀 애플리케이션이 활성화됩니다.
-
이 클라이언트 앱의 클라이언트 ID 및 클라이언트 암호를 복사합니다. 인증에 해당 인증서가 필요합니다.
작업 5: JWT 지급자 토큰을 사용하여 ORDS에 요청 전송
다음 이미지에 표시된 것처럼 Grant Type을 client_credentials
으로, Scope를 privilegetest
로 사용하여 Postman을 사용하여 OCI IAM 도메인 토큰 끝점으로 post 요청을 전송합니다.
참고: OCI IAM 도메인에서 지급자 토큰을 요청할 때는 대상자 및 범위가 범위 필드에 포함되어야 합니다.
범위, 발행자 및 대상자에 대한 JWT 토큰을 검증합니다.
이제 다음 이미지와 같이 get 요청과 함께 적합한 JWT Bearer 토큰을 제공하여 ordstest
스키마의 보호된 ORDS 리소스(데모 모듈)에 액세스할 수 있습니다.
ORDS는 JWK URL에서 공개 키를 검색하고 토큰의 서명을 확인하여 토큰을 검증합니다. 서명이 적합한 경우 ORDS는 iss
(발행자) 및 aud
(대상자) 클레임이 JWT 프로파일에 정의된 클레임과 일치하는지 여부를 확인합니다. 또한 범위 클레임이 리소스를 보호하는 권한에 해당하는지 확인합니다. 모든 조건이 충족되면 사용자에게 보호된 리소스에 대한 액세스 권한이 부여됩니다.
관련 링크
확인
- 작성자 - Chaitanya Chintala(클라우드 보안 권고자)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Access Protected Resources in ORDS using a JWT Token Issued by OCI IAM Domains
G28851-01
Copyright ©2025, Oracle and/or its affiliates.