TypeScript Academy · 강의

비밀 정보와 타입 안전성

민감한 값이 타입에 노출되지 않도록 처리합니다.

레슨 4/413개 단계

비밀 정보와 타입 안전성은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

비밀 정보는 특별히 주의해야 합니다

API 키, 비밀번호, 토큰도 config의 일부이지만 로그나 오류 메시지에 노출하면 위험합니다. 타입 안전성을 활용하면 비밀 값이 실수로 노출되는 일을 막을 수 있습니다.

실수로 로그를 기록하는 문제

일반 문자열인 비밀 값은 어디서든 실수로 기록될 수 있습니다. 예를 들어 console.log(config)를 사용하거나 전체 config 객체를 직렬화하는 오류 덤프를 생성할 때 발생할 수 있습니다.

const config = { dbPassword: "hunter2" };
console.log(config); // leaks the password

브랜디드 비밀 타입

브랜디드 타입은 컴파일 시점에 문자열에 비밀 값이라는 표시를 추가합니다. 따라서 타입 시스템이 Secret과 일반 문자열을 구분하고, 신중한 처리를 요구할 수 있습니다.

type Secret = string & { readonly __brand: "Secret" };
function secret(s: string): Secret { return s as Secret; }

브랜딩이 도움이 되는 이유

Secret은 명시적인 의도 없이 일반 string에 할당할 수 없습니다. 따라서 함수가 필요한 곳에서 Secret을 요구할 수 있고, 실수로 안전하지 않은 곳에 전달할 수 없습니다.

function connect(pw: Secret) { /* uses pw */ }
// connect("plain") -> type error; must wrap with secret()

비밀 값 래퍼 클래스

또 다른 방법은 값을 클래스 안에 감싸는 것입니다. 이 클래스의 toString과 직렬화 결과는 가려지므로 부주의하게 로그를 기록해도 자리 표시자만 표시됩니다.

class Secret {
  constructor(private readonly value: string) {}
  expose(): string { return this.value; }
  toString() { return "[REDACTED]"; }
}

직렬화할 때 값 가리기

toJSON을 사용자 지정하면 객체를 JSON.stringify로 직렬화할 때 비밀 값이 절대 나타나지 않습니다. 이는 가장 흔한 실수로 인한 노출 경로를 차단합니다.

class Secret {
  constructor(private readonly value: string) {}
  expose() { return this.value; }
  toJSON() { return "[REDACTED]"; }
}
// JSON.stringify({ pw: new Secret("x") }) -> {"pw":"[REDACTED]"}

명시적으로 노출하는 경우만 허용하기

실제 값은 expose()와 같은 명시적인 메서드를 통해서만 접근할 수 있습니다. 따라서 비밀 값을 읽는 모든 지점이 코드에서 드러나고 감사 가능해집니다.

const pw = new Secret("hunter2");
console.log(String(pw)); // [REDACTED]
connectToDb(pw.expose()); // deliberate access

넓은 타입에 비밀 값을 넣지 않기

전체가 로그로 기록될 수 있는 범용 config 인터페이스에 원시 비밀 문자열을 넣지 마십시오. Secret 타입을 사용하면 config가 출력되는 곳 어디서나 기본적으로 값이 가려집니다.

interface Config {
  host: string;
  dbPassword: Secret; // not a plain string
}

비밀 값 안전하게 불러오기

비밀 env 값을 읽는 즉시 감싸서 처음부터 브랜디드 값이나 박스에 담긴 값으로 유지하십시오. 그러면 일반 문자열로 돌아다니는 일이 없습니다.

const config = {
  host: process.env.DB_HOST!,
  dbPassword: new Secret(process.env.DB_PASSWORD!),
};

다층 방어

타입 수준의 비밀 값은 실수로 인한 노출을 줄여 주지만, 올바른 운영 관행을 대신하지는 않습니다. env를 읽을 수 있는 사람을 제한하고, 요청 본문을 기록하지 않으며, 오류 보고 시스템에서 민감한 값을 제거하십시오.

기법 요약

브랜드 타입을 사용해 신중한 처리를 강제하고, 값을 가리는 toString/toJSON을 포함한 래퍼 클래스를 만들며, 값을 읽을 때는 명시적인 expose()를 사용하십시오. 이렇게 하면 비밀값이 로그와 직렬화된 출력에 포함되지 않습니다.

간단 확인

이 레슨을 간단히 확인해 보겠습니다.

복습

브랜드 타입(신중한 처리를 강제함)이나 toString/toJSON이 [REDACTED]를 반환하는 래퍼 클래스로 비밀값을 보호하십시오. 실제 값은 명시적인 expose()를 통해서만 노출합니다. 이렇게 하면 비밀값이 로그와 직렬화된 구성에 포함되지 않습니다.

무료로 시작

AI 튜터와 함께 TypeScript을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
101
레슨
352

자주 묻는 질문

“비밀 정보와 타입 안전성” 강의는 무료인가요?

네 — “비밀 정보와 타입 안전성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“비밀 정보와 타입 안전성”에서 뭘 배우나요?

민감한 값이 타입에 노출되지 않도록 처리합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“비밀 정보와 타입 안전성” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 환경 변수에 타입 지정하기
  2. 스키마로 검증하는 설정
  3. 설정 계층화와 기본값
  4. 비밀 정보와 타입 안전성
← TypeScript Academy(으)로 돌아가기