Chapter01/Sping boot

[ 보안 취약점 ] main() 메서드

EmmaDev_v 2025. 1. 10. 11:27

 

 

최근에 마무리된 프로젝트에서

취약점 분석 결과중

 

 

디버그 목적으로 포함된 main() 메소드 혹은 지정된 디버그 메소드 호출을 검출합니다.
실제로 배포할 프로그램의 진입로 역할을 할 main() 메소드가 하나 존재해야한다면 그 소속 클래스를 옵션으로 지정하여 검출에서 제외할 수 있습니다.

 

이런 피드백을 받았다.

 

 

=> 디버그 목적으로 작성된 main() 메서드나 디버그 메서드를 식별하고, 실제 배포용 프로그램에서 불필요한 메서드를 제거해야 한다는 말임.

 

 

 

 

억울함,, 디버그 목적으로 메인메서드를 만들ㅇ지않았음ㅠ

있어야되니까 만든것이기 때문이지,, ,,

 

+ ㅅㅏ실 내가 짠 코드가 아님

그러나 고쳐야 하는 사람이 나라는 게,,

중요할 ,,뿐,, 

 

 

 

이런 진단을 받고 

main()메서드에 관해서 내가 아는 것은 이것들뿐임 

 

 

1. JVM은 Java를 시작할 때 

public static void main(String[] args)

를 찾는다,, 

 

 

2. Spring Boot도

메인메서드에서

tomcat 시작하고,,

애플리케이션 컨텍스트 초기화하고

bean설정 로드한다

 

그리고 알아두면 좋을 J2EE의 개념 ▼

 

https://dev-emma-dev.tistory.com/250

 

[ Spring Boot ] J2EE와의 관계

1. Spring Boot 와 J2EE는 다르다Spring Boot는 Spring Framework를 기반으로 애플리케이션을 더 쉽게 개발할 수 있도록 도와주는 프레임워크입니다.J2EE(Java EE, 현재는 Jakarta EE)는 대규모 애플리케이션 개발을

dev-emma-dev.tistory.com

 

 

 


 

수정해야할 코드임

 

 

 

@SpringBootApplication
@EnableScheduling
public class DayeonApplication {
	@PostConstruct
	public void init(){
		TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
	}

	public static void main(String[] args) {
		SpringApplication.run(DayeonApplication.class, args);
	}
}

 

 

 문제인 부분을 살펴보겠음

 

 

이슈 1. @PostConstruct를 사용한 초기화 작업(TimeZone 설정)이 있어 main() 메서드 외부에서도 애플리케이션 동작이 시작될 수 있음.

 

이슈 2. 초기화 로직이 분산되어 있어, main() 메서드가 진입점으로 명확하지 않음.

 

 

 

 

 

 

 

@SpringBootApplication
@EnableScheduling
public class DayeonApplication implements ApplicationRunner {

	public static void main(String[] args) {
		SpringApplication.run(DayeonApplication.class, args);
	}


	@Override
	public void run(ApplicationArguments args) throws Exception {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
        System.out.println("Default TimeZone set to: " + TimeZone.getDefault().getID());
    }


}

 

 

로 바꾸면

초기화 작업(TimeZone 설정)을 진입점 main()과 관련된 로직으로 통합하여 명확히 할 수 있다.

 

 

이슈 1. main() 메서드에 의존하는 ApplicationRunner를 활용하여 초기화 작업을 통합.

 

이슈 2. 배포용 main() 메서드가 초기화 로직을 포함한 애플리케이션의 유일한 진입점으로 명확히 정의.

 

 

timezone을 application.yml로 빼버리거나 하는 방법들도 있는데

다 내가 짠 코드가 아니라

최대한 현재에서 바뀌는것없이 하려고 이 방법을 선택함

 

 

 

결론적으로, 배포용 애플리케이션의 진입점인 main() 메서드 가 하나만 존재하도록 수정했고, 초기화 작업을 실행 흐름에 통합해 디버그 메서드 혼란을 방지했습니다 !!!

 

 

 

 

반응형