Keystoneauth 세션 사용

Jmnote (토론 | 기여)님의 2024년 6월 22일 (토) 10:39 판 (→‎개요)

1 개요

Using Sessions
세션 사용

https://docs.openstack.org/keystoneauth/latest/using-sessions.html

Crystal Clear action info.png 작성 중인 문서입니다.


2 소개

keystoneauth1.session.Session 클래스는 다양한 서비스 간에 공통 인증 및 요청 파라미터를 공유하는 다양한 OpenStack 클라이언트에 통일된 인터페이스를 제공하기 위해 keystoneauth1에 도입되었습니다.

Session과 인증 플러그인을 사용하는 모델과 일반적인 용어는 requests 라이브러리에서 많은 영감을 받았습니다. 그러나 Session 클래스나 인증 플러그인이 requests 라이브러리의 개념에 직접적으로 의존하지 않기 때문에 직접적인 변환을 기대해서는 안 됩니다.

2.1 기능

  • 공통 클라이언트 인증
인증은 다양한 인증 플러그인 중 하나에 의해 처리되며, 이 인증 정보는 동일한 Session 객체를 사용하는 모든 서비스 간에 공유됩니다.
  • 보안 유지관리
보안 코드는 단일 장소에서 유지관리되며 모든 클라이언트 간에 재사용되므로 문제가 발생할 경우 단일 위치에서 수정할 수 있습니다.
  • 표준 서비스 및 버전 발견
클라이언트는 ID 토큰이나 기타 형태의 신원확인 자격증명에 대한 지식을 필요로 하지 않습니다. 서비스, 엔드포인트, 주요 버전 검색 및 마이크로 버전 지원 검색은 Session 및 플러그인에 의해 처리됩니다. 발견 정보는 메모리에 자동으로 캐시되므로 사용자는 과도한 발견 메타데이터 사용에 대해 걱정할 필요가 없습니다.
  • 안전한 HTTP 상호작용 로깅
클라이언트는 HTTP 상호작용의 로깅을 활성화할 수 있어야 하지만, 토큰이나 비밀 정보와 같은 일부 항목은 생략해야 합니다.

3 사용자용 세션

Session 객체는 OpenStack 클라우드 서비스에 대한 접점입니다. 이 객체는 인증 자격증명과 OpenStack과 통신하는 데 필요한 연결 정보를 저장하여 여러 서비스와 통신하는 데 재사용할 수 있습니다. 서비스 생성 시 이 Session 객체가 클라이언트에 전달되어 해당 정보를 사용할 수 있습니다.

세션은 필요할 때 인증을 수행합니다. 인증이 필요한 요청이 세션을 통해 전달되면 인증 플러그인은 유효한 토큰을 요청합니다. 유효한 토큰이 있으면 사용되고, 그렇지 않은 경우 인증 플러그인이 인증 서비스에 연락하여 새 토큰을 가져올 수 있습니다.

Session을 사용하는 keystoneclient 예제:

from keystoneauth1.identity import v3
from keystoneauth1 import session
from keystoneclient.v3 import client

auth = v3.Password(auth_url='https://my.keystone.com:5000/v3',
                   username='myuser',
                   password='mypassword',
                   project_name='proj',
                   user_domain_id='default',
                   project_domain_id='default')
sess = session.Session(auth=auth,
                       verify='/path/to/ca.cert')
ks = client.Client(session=sess)
users = ks.users.list()

다른 OpenStack 클라이언트 라이브러리도 이와 유사한 방식으로 세션 객체를 클라이언트 생성자에 전달하여 생성됩니다.

3.1 인증 플러그인 공유

세션은 하나의 인증 플러그인만 포함할 수 있습니다. 그러나 인증 플러그인이 그 세션에 구체적으로 묶여 있는 것은 아니므로, 기존 인증 플러그인을 재사용하여 새로운 세션을 만들 수 있습니다:

new_sess = session.Session(auth=sess.auth,
                           verify='/path/to/different-cas.cert')

이 경우, 인증 호출을 수행할 때 어떤 세션 객체가 사용될지 알 수 없으므로 명령은 어느 세션에서도 성공할 수 있어야 합니다.

인증 플러그인은 요청별로도 제공될 수 있습니다. 이는 하나의 세션이 여러 인증 자격증명을 다루는 상황에서 유용합니다:

sess.get('https://my.keystone.com:5000/v3',
         auth=my_auth_plugin)

인증 플러그인이 파라미터를 통해 제공되면 세션의 인증 플러그인을 무시하고 해당 플러그인이 우선 사용됩니다.

4 클라이언트 개발자용 세션

세션은 인증 데이터 및 토큰 형식 처리를 간소화하여 클라이언트가 엔드포인트를 선택하기 위한 필터 파라미터를 지정하고 카탈로그의 구문 분석을 쉽게 관리할 수 있도록 돕습니다.

4.1 메이저 버전 발견과 마이크로버전 지원

OpenStack에서 사용 가능한 서비스의 루트 URL은 사용자가 받는 토큰의 일부인 서비스 카탈로그라는 객체에 포함되어 배포됩니다. 클라이언트는 제공된 URL을 사용하는 대신 서비스 카탈로그에서 URL을 가져와야 합니다. 특정 서비스의 루트 URL은 서비스의 엔드포인트라고 하며, 특정 버전의 서비스 URL은 버전화된 엔드포인트라고 합니다. 서비스에 대한 REST 요청은 주어진 버전화된 엔드포인트에 대해 수행됩니다.

주요 API 버전과 마이크로버전 주제는 혼란스러울 수 있습니다. keystoneauth는 주요 API 버전과 연결된 버전화된 엔드포인트 발견 및 해당 엔드포인트가 지원하는 마이크로버전에 대한 정보 가져오기 기능을 제공하므로, 두 가지의 차이점을 이해하는 것이 중요합니다.

개념적으로 가장 중요한 것은 주요 API 버전이 개별 버전화된 엔드포인트의 URL을 설명하는 반면, 주어진 버전화된 엔드포인트는 지원하는 마이크로버전 범위를 표현할 수 있다는 점입니다.

사용자가 서비스에 대해 REST 요청을 하고자 할 때, 사용자는 주요 API 버전과 서비스 유형을 명시하여 적절한 버전화된 엔드포인트를 찾고 사용합니다. 예를 들어, 사용자가 cloud.example.com에서 버전 2의 컴퓨트 서비스를 요청하면 https://compute.example.com/v2라는 버전화된 엔드포인트를 얻게 됩니다.

각 서비스는 각 버전화된 엔드포인트의 루트에 해당 버전화된 엔드포인트에 대한 정보를 포함하는 발견 문서를 제공합니다. 또한 각 서비스는 모든 사용가능한 버전화된 엔드포인트의 발견 문서 목록을 포함하는 문서를 비-버전화된 엔드포인트의 루트에 제공합니다. 이러한 문서를 통해 사용자가 원하는 주요 API 버전에 해당하는 버전화된 엔드포인트를 찾을 수 있습니다.

각 문서는 또한 해당 버전화된 엔드포인트가 이해하는 최소 및 최대 마이크로버전을 나열하여 지원하는 마이크로버전을 나타낼 수 있습니다. 요청된 주요 API 버전에 대한 버전화된 엔드포인트를 찾은 결과로, 사용자는 해당 버전화된 엔드포인트에서 사용할 수 있는 마이크로버전을 알 수 있습니다.

클라이언트가 주요 API 버전의 엔드포인트에 REST 요청을 할 때, 클라이언트는 선택적으로 개별 요청마다 헤더에 특정 마이크로버전을 사용하도록 명시할 수 있습니다. 클라이언트가 마이크로버전을 요청하지 않으면 서비스는 최소 지원 마이크로버전이 지정된 것처럼 동작합니다.

전체 거래는 세 부분으로 구성됩니다:

  • 주어진 서비스의 주요 API 버전에 대한 엔드포인트는 무엇인가?
  • 해당 엔드포인트에서 지원하는 최소 및 최대 마이크로버전은 무엇인가?
  • 사용자가 특정 요청에 대해 사용하고자 하는 마이크로버전 범위는 무엇인가?

keystoneauth는 주어진 서비스의 주요 API 버전에 대한 엔드포인트를 발견하고, 해당 엔드포인트가 지원하는 마이크로버전 범위를 보고하는 기능을 제공합니다.

마이크로버전카탈로그 소비에 대한 자세한 정보는 API-WG 스펙에서 확인할 수 있습니다.

4.2 인증

Session 객체를 사용하여 요청을 보낼 때, 키워드 파라미터로 authenticated를 전달하여 토큰이 포함되어야 하는지 여부를 지정할 수 있습니다. 기본적으로 인증 플러그인이 사용가능한 경우 토큰이 포함됩니다:

# Keystone에서는 기본적으로 이 라우트가 보호되지 않습니다
resp = sess.get('https://my.keystone.com:5000/v3',
                    authenticated=False)

4.3 서비스 발견

4.4 어댑터 사용

4.5 엔드포인트 메타데이터

4.6 마이크로버전 요청

5 로깅

5.1 로거 사용

5.2 사용자 제공 로거

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}