하드코딩된 자격증명 (Hardcoded Credentials)

Hardcoded Credentials

설명

하드코딩된 자격증명(Hardcoded Credentials)은 소스코드 내에 인증서, 비밀번호, 암호화 키, API Key 등 중요한 비밀 정보를 직접 작성해 두는 취약점입니다. 소스코드는 다양한 경로(깃 저장소, 배포 아카이브 등)로 유출될 위험이 있으며, 여기에 저장된 비밀 정보도 함께 노출되어 외부 혹은 내부 공격자가 무단으로 시스템에 접근할 수 있습니다.

잠재적 영향

  • 무단 접근 (비인가된 접근): 하드코딩된 비밀이 외부에 노출될 경우, 공격자가 JWT 토큰을 위조하거나 탈취하여 시스템을 무단으로 접근할 수 있습니다.

  • 데이터 유출: 중요한 데이터에 접근해 정보를 유출하거나 변조할 수 있습니다.

  • 서비스 손상: 인증서나 키가 노출될 경우 전체 서비스가 중단될 수 있으며, 신뢰성이 크게 저하됩니다.

해결 방법

  • 비밀 정보(Secret)는 소스코드에 절대 직접 작성하지 않습니다.

  • 환경변수(environment variable), 파일 기반 비밀 저장소, 혹은 보안 vault(HSM, Secret Manager 등)에서 값을 불러와 사용합니다.

  • 소스코드와 별도의 설정 파일에 비밀 정보를 분리해 관리하고, 해당 파일은 접근 권한을 엄격히 제한합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

const { JWT } = require('jose')
const payload = {foo: 'bar'}

// 취약: 비밀키가 소스코드 내에 하드코딩됨
const token = JWT.sign(payload, 'my-secret-key')

안전한 코드

설명:

  • 취약한 코드: 비밀키('my-secret-key')가 코드에 직접 노출되어 있습니다. 코드를 열람할 수 있는 누구나 이 값을 통해 JWT 토큰을 위조하거나 시스템에 접근할 수 있습니다.

  • 안전한 코드: 비밀키를 환경변수(process.env.JWT_SECRET)에서 불러오도록 하여, 코드 자체에는 비밀 정보가 남지 않으므로 외부에 노출 위험이 줄어듭니다. 또한, 운영 환경별로 다른 키를 사용할 수 있어 보안 관리가 더 수월합니다.

참조

Last updated