하드코딩된 계정 사용

Use of Hard-coded Credentials

설명

비밀번호나 인증용 키 같은 인증 정보를 소스 코드에 직접 넣어 사용하는 경우 발생합니다.

잠재적 영향

  • 노출된 인증 정보를 사용해 보호된 기능이나 데이터에 무단으로 접근할 수 있습니다.
  • 해당 계정에 높은 권한이 있다면 관리자 권한이 악용될 수 있습니다.

해결 방법

  • 인증 정보는 접근이 제한된 비밀 저장소나 배포 시 주입되는 설정으로 관리하고, 실제 값은 저장소에 커밋하지 마세요. 이미 노출된 값은 폐기하고 교체하세요.
  • 사용자 비밀번호의 검증에는 Spring Security의 PasswordEncoder처럼 검증된 기능을 사용하세요.
  • 사용자 비밀번호는 복호화 가능한 암호화나 평문 대신 비밀번호 저장에 적합한 단방향 해시로 보관하세요.

예시

변경 전

java
@RestController
public class LoginController {

    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin123"; // 하드코딩된 비밀번호

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        if (USERNAME.equals(username) && PASSWORD.equals(password)) {
            return "로그인 성공";
        }
        return "로그인 실패";
    }
}

변경 후

java
@RestController
public class LoginController {

    @Value("${credentials.username}")
    private String username;

    @Value("${credentials.password}")
    private String password;

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        if (this.username.equals(username) && this.password.equals(password)) {
            return "로그인 성공";
        }
        return "로그인 실패";
    }
}

설명:

  • 변경 전: 코드에 접근할 수 있는 사람이 하드코딩된 비밀번호를 읽을 수 있습니다.
  • 변경 후: @Value로 외부 설정을 읽는 방법을 보여 줍니다. 설정 파일에 실제 비밀번호를 커밋하지 말고 전달 경로와 접근 권한을 보호하세요. 이 예시의 평문 비교는 완전한 로그인 구현이 아니며, 사용자 인증에는 적절한 비밀번호 해시 검증이 필요합니다.

관련 CVE

참조