스키마를 통한 PHP 상수 및 환경 변수
환경 변수 또는 PHP 상수에서 값을 쿼리합니다.
설명
이 확장 기능은 GraphQL 스키마에 전역 필드 _env를 추가합니다. 이를 통해 환경 변수 또는 PHP 상수(주로 wp-config.php에서 정의되지만, 다른 곳에서도 정의할 수 있습니다)에서 값을 가져올 수 있습니다.
보안상의 이유로, 접근할 수 있는 환경 변수 및 상수의 이름은 명시적으로 설정해야 합니다.
필드 _env는 파라미터 "name"에 환경 변수 또는 상수의 이름을 받아 다음과 같이 처리됩니다:
- 해당 이름의 환경 변수가 있으면 그 값을 반환합니다
- 그렇지 않고 해당 이름의 상수가 있으면 그 값을 반환합니다
- 그렇지 않으면
null을 반환하고 GraphQL 출력에 오류를 추가합니다.
예를 들어, 다음 쿼리는 GitHub 비공개 리포지토리 접근을 위해 설정한 환경 상수 GITHUB_ACCESS_TOKEN을 가져옵니다:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}이 쿼리는 wp-config.php 파일에 정의된 DB 설정을 가져옵니다:
{
dbName: _env(name: "DB_NAME")
dbUser: _env(name: "DB_USER")
dbPassword: _env(name: "DB_PASSWORD")
dbHost: _env(name: "DB_HOST")
}환경 상수 접근 설정
쿼리 가능한 환경 변수 및 상수의 허용 목록을 설정해야 합니다.
각 항목은 다음 중 하나입니다:
/또는#으로 둘러싸인 경우 정규 표현식(regex)- 그 외의 경우 변수 또는 상수의 전체 이름
예를 들어, 다음 항목들은 모두 환경 변수 "GITHUB_ACCESS_TOKEN"에 일치합니다:
GITHUB_ACCESS_TOKEN#^([A-Z]*)_ACCESS_TOKEN$#/GITHUB_(\S+)/
이 설정을 적용할 수 있는 위치는 우선순위 순으로 2곳이 있습니다:
- 커스텀: 해당 Schema Configuration 내
- 일반: 설정 페이지 내
엔드포인트에 적용된 Schema Configuration에서 옵션 "Use custom configuration"을 선택한 후 원하는 항목을 입력합니다:

그렇지 않으면, 설정의 「Environment Fields」 탭에서 정의된 항목이 사용됩니다:

「Allow access」와 「Deny access」 두 가지 동작 방식이 있습니다:
- Allow access: 설정된 항목만 접근 가능하며, 그 외에는 접근할 수 없습니다
- Deny access: 설정된 항목에는 접근할 수 없으며, 그 외 모든 항목에는 접근할 수 있습니다

보안: 환경 변수 접근
이 확장 기능은 민감한 데이터가 노출되지 않도록 여러 보호 레이어를 적용합니다:
-
사용자는 로그인 상태여야 합니다. 이 필드에 접근하려면 인증이 필요합니다.
-
쿼리 가능한 환경 변수 목록은 기본적으로 비어 있습니다. 명시적으로 설정되기 전까지 어떤 항목도 읽을 수 없습니다.
-
관리자 사용자는 모든 환경 변수에 접근할 수 있습니다.
-
관리자가 아닌 사용자의 경우, 설정에서 명시적으로 허용되더라도 다음 환경 변수는 항상 접근이 거부됩니다:
WordPress 환경 변수:
AUTH_KEYSECURE_AUTH_KEYLOGGED_IN_KEYNONCE_KEYAUTH_SALTSECURE_AUTH_SALTLOGGED_IN_SALTNONCE_SALTDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_CHARSETDB_COLLATE
이름에 다음 부분 문자열 중 하나라도 포함된 환경 변수:
PASSWORDPASSWDSECRETPRIVATE_KEYAPI_KEYAPIKEYACCESS_KEYACCESS_TOKENAUTH_TOKENBEARERCREDENTIALSALT
보안: 인증 정보 노출 방지
GraphQL API가 공개적으로 노출된 경우(정적 사이트 빌드 시와 같은 예외를 제외하고), GraphQL 쿼리가 비공개 데이터를 노출하지 않도록 주의해야 합니다:
- 쿼리의 응답에 포함되는 경우
- 오류 발생 시 출력에 포함되는 경우
- 로그에 포함되는 경우
예를 들어, 다음 쿼리는:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
}...응답에 인증 정보를 직접 출력합니다:
{
"data": {
"githubAccessToken": "{some access token}"
}
}플러그인의 다른 기능들을 활용하여 GraphQL 쿼리를 안전하게 만들 수 있습니다:
- Field to Input: 동적 변수를 통해 환경 변수 값을 다른 필드에 주입합니다
- Field Response Removal: 환경 변수의 값이 출력에 표시되지 않도록 합니다
- HTTP Client: GraphQL 쿼리 내에서 직접 외부 서비스에 연결합니다
예를 들어, 다음 쿼리는 비공개 액세스 토큰을 사용하여 GitHub REST API에 연결합니다:
{
githubAccessToken: _env(name: "GITHUB_ACCESS_TOKEN")
# This directive will remove this entry from the output
@remove
# Create the authorization header to send to GitHub
authorizationHeader: _sprintf(
string: "Bearer %s",
# "Field to Input" feature to access value from the field above
values: [$__githubAccessToken]
)
# Do not print in output
@remove
# Use the field from "Send HTTP Request Fields" to connect to GitHub
gitHubArtifactData: _sendJSONObjectCollectionHTTPRequest(
input: {
url: "https://api.github.com/repos/GatoGraphQL/GatoGraphQL/actions/artifacts",
options: {
headers: [
{
name: "Accept"
value: "application/vnd.github+json"
},
{
name: "Authorization"
# "Field to Input" feature to access value from the field above
value: $__authorizationHeader
},
]
}
}
)
}이 쿼리에서 민감한 데이터를 포함하는 필드 githubAccessToken과 authorizationHeader는 모두 출력에서 제거됩니다. 필드 gitHubArtifactData는 API 호출 결과를 출력하지만, 입력값(예: 오류 발생 시 변수의 실제 값 대신 문자열 "$__authorizationHeader"가 출력됩니다)은 노출되지 않습니다.