스프링
-
시큐리티의 CSRF 그리고 테스트스프링 2023. 3. 5. 16:09
CSRF란 웹 애플리케이션의 취약점 중 하나로, 이용자가 의도하지 않은 요청을 통한 공격을 의미한다. (작년 네트워크 보안수업시간에 이를 프로젝트로 구현 / 실습해 본적이 있어서 이해하는데는 큰 어려움이 없었다.) CSRF 공격을 방어하는 방법으로 다음과 같은 방어법이 있다. Referrer 검증 서버단에서 request의 referrer을 확인하여 domain이 일치하는지 검증하는 방법. referrer 검증만으로 대부분의 CSRF 공격을 방어할 수 있다. Spring Security CSRF Token 임의의 토큰을 발급한 후 자원에 대한 변경 요청일 경우 Token 값을 확인한 후 클라이언트가 정상적인 요청을 보낸것인지 확인합. 만약 CSRF Token이 존재하지 않거나, 기존의 Token과 일치하..
-
@RequestBody vs @RequestParam스프링 2023. 2. 21. 01:54
오랜만에 스프링을 통해 작업하려던중, 이 둘이 헷갈려서 정리하기로 하였다. form태그를 통하여 데이터를 전송하려 한다. @RequestParam은 HTTP 요청 파라미터를 받아온다. HTTP의 Body를 직접 조회하지 않는다. @ResponseBody @PostMapping("test/request-param") public TestData requestParam(@RequestParam String name, @RequestParam int age) { TestData testData = new TestData(); testData.setName(name); testData.setAge(age); return testData; } 즉, test/request-param?name="abc"&age=2 ..
-
API 예외처리-5 (RestControllerAdvice)스프링 2023. 1. 28. 22:39
이전의 코드들 보자 @Slf4j @RestController public class ApiExceptionV2Controller { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArgumentException e) { log.error("ex", e); return new ErrorResult("BAD", e.getMessage()); } @ExceptionHandler(UserException.class) public ResponseEntity userExHandler(UserException e) { log.e..
-
API 예외처리-4 (ExceptionHandler)스프링 2023. 1. 28. 00:32
HandlerExceptionResolver 를 직접 사용하기는 복잡하다. API 오류 응답의 경우 response 에 직접 데이터를 넣어야 해서 매우 불편하고 번거롭다. ModelAndView 를 반환해야 하는 것도 API에는 잘 맞지 않는다. 스프링은 이 문제를 해결하기 위해 @ExceptionHandler 라는 매우 혁신적인 예외 처리 기능을 제공한다. 스프링은 ExceptionHandlerExceptionResolver 를 기본으로 제공하고, 기본으로 제공하는 ExceptionResolver 중에 우선순위도 가장 높다. @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArgumen..
-
API 예외처리-3스프링 2023. 1. 27. 23:55
예외가 발생하면 WAS까지 예외가 던져지고, WAS에서 오류 페이지 정보를 찾아서 다시 /error 를 호출하는 과정은 생각해보면 너무 복잡하다. WAS까지가지 않고 예외를 처리해보자. @Slf4j public class UserHandlerExceptionResolver implements HandlerExceptionResolver { private ObjectMapper objectMapper = new ObjectMapper(); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex i..
-
API 예외처리-2스프링 2023. 1. 27. 16:20
API 마다, 각각의 컨트롤러나 예외마다 서로 다른 응답 결과를 출력해야 할 수도 있다. 예를 들어서 회원과 관련된 API에서 예외가 발생할 때 응답과, 상품과 관련된 API에서 발생하는 예외에 따라 그 결과가 달라질 수 있다. 예외가 발생해서 서블릿을 넘어서 WAS까지 전달되면 HTTP코드는 500이 된다. 이때 예외외 따랄서 다른 상태코드로 처리하고싶고, 형식을 API마다 다르게 처리하고 싶다면 어떻게 해야할까? HandlerExceptionResolver 서블릿을 넘어서 WAS까지 예외가 전달되면 status는 500으로 처리된다. 발생하는 예외에 따라서 400, 404 등등 다른 상태코드도 처리하고 형식을 다르게 하려면 HandlerExceptionResolver를 이용해야 한다. HandlerE..
-
API 예외처리-1스프링 2023. 1. 26. 14:17
HTML페이지는 4xx, 5xx와같은 오류 페이지만 준비해놓으면 대부분 문제 해결이 가능하다. 그러나 API는 각 오류 상황에 맞는 오류 응답스펙을 정하고 JSON으로 데이터를 내려주어야 하기때문에 고민해야 될것이 많다. API를 요청했는데, 정상의 경우 API로 JSON 형식으로 데이터가 정상 반환된다. 그런데 오류가 발생하면 우리가 미리 만들어둔 오류 페이지 HTML이 반환된다. JSON으로 원하는 형식에 맞추어 해당 정보를 주어야 한다. @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory fac..
-
OAuth2.0과 JWT적용 - 3스프링 2023. 1. 25. 22:17
처음 들어오는 사용자가 OAuth로그인 후 -> 처음 들어오는 사용자면 DB에 정보 저장후 -> 토큰 발급 이러한 로직을 수행하려고 한다. 우선 Controller를 먼저 구성해보자 @RestController @RequiredArgsConstructor public class MemberController { private final OAuthService oAuthService; @GetMapping("/oauth/login") public ResponseEntity loginController(@AuthenticationPrincipal OAuth2User oAuth2User) { return ResponseEntity.ok(oAuthService.login(oAuth2User.getAttribut..