2.7 중요정보 저장
개요
개인정보(주민등록번호, 신용카드 번호 등), 인증 정보(비밀번호, API 키 등), 시스템 중요 설정 정보 등 민감한 데이터를 저장할 때는 반드시 암호화하여 기밀성을 보장해야 합니다. 중요 정보를 평문으로 데이터베이스, 파일, 쿠키 등에 저장할 경우, 데이터 유출 사고 발생 시 심각한 피해로 이어질 수 있습니다.
암호화 시에는 검증된 안전한 암호 알고리즘과 운영 모드를 사용해야 하며(참조: 2.6 암호연산), 암호화에 사용된 키는 안전하게 관리되어야 합니다(참조: 2.5 암호키 관리). 비밀번호와 같이 단방향 암호화가 필요한 경우에는 솔트를 사용한 안전한 해시 함수를 적용해야 합니다(참조: 2.3 비밀번호 관리).
이 기준은 데이터베이스, 파일 시스템, 쿠키, 모바일 기기 등 다양한 저장 매체에 중요 정보를 저장할 때 평문 저장을 금지하고, 안전한 암호화 기법을 적용하기 위한 보안 요구사항을 정의합니다.
보안 대책
- - 중요 정보 식별 및 분류: 저장되는 데이터 중 개인정보, 금융 정보, 인증 정보 등 보호해야 할 중요 정보의 범위를 명확히 식별하고 분류합니다.
- - 평문 저장 금지: 식별된 중요 정보는 절대로 평문 상태로 저장하지 않습니다.
- - 안전한 암호화 적용:
- 데이터 기밀성이 요구되는 경우(복호화 필요): AES 등 강력한 대칭키 알고리즘과 GCM 등 안전한 운영 모드를 사용하여 암호화 저장합니다. 암호키는 안전하게 관리합니다.
- 비밀번호 등 검증만 필요한 경우(복호화 불필요): bcrypt, scrypt, Argon2, PBKDF2 등 솔트를 사용한 안전한 해시 함수로 해시값을 저장합니다.
- - 저장 매체별 보안 강화:
- 데이터베이스: 중요 컬럼 암호화, DB 접근 통제 강화, TDE(Transparent Data Encryption) 등 DB 자체 암호화 기능 활용을 고려합니다.
- 파일 시스템: 파일 암호화, 파일 및 디렉토리 접근 권한 최소화, OS 수준 암호화 기능 활용을 고려합니다.
- 쿠키: 민감 정보는 쿠키에 저장하지 않는 것이 원칙입니다. 불가피한 경우 암호화하고, `HttpOnly`, `Secure`, `SameSite` 속성을 적용합니다.
- 모바일 기기: 앱 내부 저장소(Shared Preferences, SQLite 등)에 중요 정보 저장 시 기기별 고유 키 등을 이용한 암호화를 적용하고, 안전한 저장소(Keystore, Keychain) 사용을 고려합니다.
- - 접근 통제 및 로깅: 암호화된 중요 정보가 저장된 위치에 대한 접근 통제를 강화하고, 접근 시도를 로그로 기록 및 감사합니다.
코드 예시 (Java - 설정 파일의 민감 정보 암호화)
데이터베이스 접속 비밀번호 등 설정 파일에 포함될 수 있는 민감 정보를 평문으로 저장하는 대신 암호화하는 예시입니다.
취약한 예시 (설정 파일 평문 저장):
# config.properties
db.username=myuser
# 비밀번호가 평문으로 노출됨 (취약!)
db.password=mysecretpassword
db.url=jdbc:mysql://localhost:3306/mydb
# config.properties (암호화된 값)
db.username=myuser
# 비밀번호를 Jasypt 등으로 암호화하여 저장 (예시)
db.password=ENC(aBcDeFgHiJkLmNoPqRsTuVwXyZ...)
db.url=jdbc:mysql://localhost:3306/mydb
# Jasypt 설정 (별도 파일 또는 환경 변수)
# 암호화 키 (안전하게 관리되어야 함 - 하드코딩 금지!)
jasypt.encryptor.password=YourMasterPasswordOrKeyLoadedSecurely
jasypt.encryptor.algorithm=PBEWithHMACSHA512AndAES_256
# ... 기타 Jasypt 설정 ...
// Java 코드 (Spring Boot + Jasypt 예시)
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class DbConfig {
@Value("${db.username}")
private String username;
// Jasypt가 자동으로 ENC(...) 값을 복호화하여 주입
@Value("${db.password}")
private String password;
@Value("${db.url}")
private String url;
// ... Getter 메서드 ...
public String getPassword() {
// 복호화된 비밀번호 반환
return password;
}
}
Jasypt 외에도 각 프레임워크나 환경에서 제공하는 설정 암호화 기능을 사용하거나, Vault 등 외부 시크릿 관리 도구를 연동하여 중요 정보를 안전하게 관리할 수 있습니다. Python(django-environ, python-dotenv + cryptography), C#(User Secrets, Azure Key Vault), Node.js(dotenv, KMS) 등에서도 유사한 방식으로 중요 정보를 코드나 평문 설정 파일과 분리하여 관리해야 합니다.