메인 컨텐츠로 건너뛰기

보안

WebdriverIO는 솔루션을 제공할 때 보안 측면을 고려합니다. 아래는 테스트를 더 안전하게 보호하는 몇 가지 방법입니다.

모범 사례​

  • 노출 시 조직에 해를 끼칠 수 있는 민감한 데이터를 평문으로 하드코딩하지 마세요.
  • 키와 비밀번호를 안전하게 저장하고 엔드-투-엔드 테스트를 시작할 때 검색할 수 있는 메커니즘(예: 볼트)을 사용하세요.
  • 네트워크 로그의 인증 토큰과 같은 민감한 데이터가 로그 및 클라우드 제공업체에 노출되지 않는지 확인하세요.
정보

테스트 데이터라도 악의적인 사람이 잘못된 방법으로 정보를 검색하거나 악의적인 의도로 해당 리소스를 사용할 수 있는지 묻는 것이 중요합니다.

민감한 데이터 마스킹​

테스트 중에 민감한 데이터를 사용하는 경우, 로그와 같은 곳에서 모든 사람에게 표시되지 않도록 하는 것이 중요합니다. 또한 클라우드 제공업체를 사용할 때는 종종 개인 키가 관련됩니다. 이 정보는 로그, 리포터 및 기타 접점에서 마스킹되어야 합니다. 다음은 이러한 값을 노출하지 않고 테스트를 실행하기 위한 몇 가지 마스킹 솔루션을 제공합니다.

WebDriverIO​

명령어의 텍스트 값 마스킹하기​

addValue와 setValue 명령은 로그와 리포터에서 마스킹하기 위한 불리언 마스크 값을 지원합니다. 또한 성능 도구 및 타사 도구와 같은 다른 도구도 마스크 버전을 수신하여 보안을 강화합니다.

예를 들어, 실제 프로덕션 사용자를 사용하고 마스킹하려는 비밀번호를 입력해야 하는 경우 다음과 같이 가능합니다:

  async enterPassword(userPassword) {
const passwordInputElement = $('Password');

// Get focus
await passwordInputElement.click();

await passwordInputElement.setValue(userPassword, { mask: true });
}

위의 코드는 WDIO 로그에서 텍스트 값을 다음과 같이 숨깁니다:

로그 예시:

INFO webdriver: DATA { text: "**MASKED**" }

Allure 리포터와 같은 리포터와 BrowserStack의 Percy와 같은 타사 도구도 마스킹된 버전을 처리합니다. 적절한 Appium 버전과 함께 사용하면 Appium 로그에서도 민감한 데이터가 제외됩니다.

정보

제한사항:

  • Appium에서는 마스킹을 요청해도 추가 플러그인에서 정보가 유출될 수 있습니다.
  • 클라우드 제공업체는 설정된 마스크 메커니즘을 우회하는 HTTP 로깅 프록시를 사용할 수 있습니다.
  • getValue 명령은 지원되지 않습니다. 또한 동일한 요소에 사용하면 addValue 또는 setValue를 사용할 때 마스킹하려는 값이 노출될 수 있습니다.

최소 필요 버전:

  • WDIO v9.15.0
  • Appium v3.0.0

WDIO 로그에서 마스킹하기​

maskingPatterns 구성을 사용하면 WDIO 로그에서 민감한 정보를 마스킹할 수 있습니다. 그러나 Appium 로그는 포함되지 않습니다.

예를 들어, 클라우드 제공업체를 사용하고 info 레벨을 사용하는 경우 아래와 같이 사용자 키가 "유출"될 가능성이 높습니다:

INFO @wdio/local-runner: Start worker 0-0 with arg: ./wdio.conf.ts --user=cloud_user --key=myCloudSecretExposedKey --spec myTest.test.ts

이를 방지하기 위해 정규 표현식 '--key=([^ ]*)'을 전달하면 로그에서 다음과 같이 표시됩니다:

INFO @wdio/local-runner: Start worker 0-0 with arg: ./wdio.conf.ts --user=cloud_user --key=**MASKED** --spec myTest.test.ts

구성의 maskingPatterns 필드에 정규 표현식을 제공하여 위와 같은 결과를 얻을 수 있습니다.

export const config: WebdriverIO.Config = {
specs: [...],
capabilities: [{...}],
services: ['lighthouse'],

/**
* test configurations
*/
logLevel: 'info',
maskingPatterns: '/--key=([^ ]*)/',
framework: 'mocha',
outputDir: __dirname,

reporters: ['spec'],

mochaOpts: {
ui: 'bdd',
timeout: 60000
}
}
정보

최소 필요 버전:

  • WDIO v9.15.0

WDIO 로거 비활성화하기​

민감한 데이터의 로깅을 차단하는 또 다른 방법은 로그 레벨을 낮추거나 무음으로 설정하거나 로거를 비활성화하는 것입니다. 다음과 같이 수행할 수 있습니다:

import logger from '@wdio/logger';

/**
* Set the logger level of the WDIO logger to 'silent' before *running a promise, which helps hide sensitive information in the logs.
*/
export const withSilentLogger = async <T>(promise: () => Promise<T>): Promise<T> => {
const webdriverLogLevel = driver.options.logLevel ?? 'error';

try {
logger.setLevel('webdriver', 'silent');
return await promise();
} finally {
logger.setLevel('webdriver', webdriverLogLevel);
}
};

타사 솔루션​

Appium​

Appium은 자체 마스킹 솔루션을 제공합니다. Log filter 참조

  • 그들의 솔루션을 사용하는 것은 까다로울 수 있습니다. 가능하다면 @mask@와 같은 토큰을 문자열에 전달하고 정규 표현식으로 사용하는 방법이 있습니다.
  • 일부 Appium 버전에서는 각 문자가 쉼표로 구분되어 값이 기록되므로 주의해야 합니다.
  • 안타깝게도 BrowserStack은 이 솔루션을 지원하지 않지만 로컬에서는 여전히 유용합니다.

앞서 언급한 @mask@ 예제를 사용하면 다음과 같은 JSON 파일인 appiumMaskLogFilters.json을 사용할 수 있습니다

[
{
"pattern": "@mask@(.*)",
"flags": "s",
"replacer": "**MASKED**"
},
{
"pattern": "\\[(\\\"@\\\",\\\"m\\\",\\\"a\\\",\\\"s\\\",\\\"k\\\",\\\"@\\\",\\S+)\\]",
"flags": "s",
"replacer": "[*,*,M,A,S,K,E,D,*,*]"
}
]

그런 다음 appium 서비스 구성의 logFilters 필드에 JSON 파일 이름을 전달합니다:

import { AppiumServerArguments, AppiumServiceConfig } from '@wdio/appium-service';
import { ServiceEntry } from '@wdio/types/build/Services';

const appium = [
'appium',
{
args: {
log: './logs/appium.log',
logFilters: './appiumMaskLogFilters.json',
} satisfies AppiumServerArguments,
} satisfies AppiumServiceConfig,
] satisfies ServiceEntry;

BrowserStack​

BrowserStack도 일부 데이터를 숨기기 위한 마스킹 기능을 제공합니다. hide sensitive data 참조

  • 안타깝게도 이 솔루션은 전부 또는 전무의 접근 방식이므로 제공된 명령어의 모든 텍스트 값이 마스킹됩니다.

Welcome! How can I help?

WebdriverIO AI Copilot