@Controller
어노테이션이 달린 클래스의(메타 어노테이션을 통해 직접 또는 간접적으로 - Spring Boot의 @RestController
와 같이) @RequestMapping
주석 부분이 있는 메서드는 일치하는 웹 요청을 처리하기 위해 호출됩니다.
스프링은 가시성을 확인하지 않고 리플렉션을 통해 이러한 메서드를 호출하기 때문에 메서드가 private 인 경우에도 메소드는 호출됩니다.
따라서, 민감한 메소드를 private 로 선언하는 것이 그러한 코드가 호출되는 것을 제어하는 좋은 방법처럼 보일 수 있습니다. 하지만 불행하게도, 모든 스프링 프레임워크가 이러한 방식으로 가시성을 무시하는 것은 아닙니다.
예를 들어, 민감하고, 개인적인 웹 접근을 제어하기 위해 @RequestMapping
어노테이션이 달린 메소드에 @Secured
어노테이션을 붙인 경우에도 여전히 유저의 인증 여부에 상관 없이 접근이 가능합니다.
이것은 AOP 프록시가 private 메소드에는 적용되지 않기 때문입니다.
이 규칙은 @RequestMapping
어노테이션 이외에도 스프링 프레임워크 4.3 부터 도입된 @GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
, @PatchMapping
어노테이션 또한 고려합니다.
규칙을 어긴 코드
@RequestMapping("/greet", method = GET)
private String greet(String greetee) { // 규칙을 어긴 코드
규칙을 준수한 해결책
@RequestMapping("/greet", method = GET)
public String greet(String greetee) {
참고
- OWASP Top 10 2017 Category A6 - Security Misconfiguration
If you like SONARKUBE, don’t forget to give me a star.