API 통신으로 데이터를 요청하고 응답을 받는 것은 당연한 일입니다.
그리고 GET 요청일 경우는 주소창에 찍어보면 응답받은 데이터를 볼 수 있습니다.
저는 이렇게 응답받은 데이터를 보면서 JavaScript를 통해 데이터를 뿌려주는 작업을 좋아해서
자주 보는 화면인데 문득 그런 생각이 들었습니다.
이 화면은 개발자가 봐야 하는 화면인데 일반 사용자에게는 이런 화면을 보여주면 안 되지 않을까 라는 생각을 했습니다.
물론 일반 사용자가 저런 API 주소를 치고 확인하는 일은 없을 거라고 생각을 하지만 이 기회에 조금이라도 공부가 되지 않을까 해서 혼자 고민도 해보고 강사님께도 여쭈어봐서 Filter로 막아주는 방법을 선택했습니다.
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<AjaxFilter> ajaxFilter() {
FilterRegistrationBean<AjaxFilter> bean = new FilterRegistrationBean<>(new AjaxFilter());
bean.addUrlPatterns("/api/*"); // url 패턴은 api가 들어가있는 모든 요청 주소
bean.setOrder(1); // 우선순위
return bean;
}
}
public class AjaxFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
PrintWriter out = response.getWriter();
String xRequestedWith = httpServletRequest.getHeader("x-requested-with");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
if(xRequestedWith != null) {
if(!xRequestedWith.equals("XMLHttpRequest")) { // AJAX 요청이 아니라면
out.print(getMessage());
return;
}
}else {
out.print(getMessage());
return;
}
chain.doFilter(httpServletRequest, response);
}
private String getMessage() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<html><body><script>");
stringBuilder.append("alert(\'잘못된 접근입니다.\');");
stringBuilder.append("location.replace(\'/main\');");
stringBuilder.append("</script></body></html>");
return stringBuilder.toString();
}
}
우선 AjaxFilter를 Filter를 상속받아서 구현해줍니다.
요청헤더에서 "x-requested-with"라는 키값으로 value를 가져옵니다.
가져온 값이 "XMLHttpRequest" 라면 Ajax 요청이라는 의미로 Ajax 요청은 허용을 시켜주어야 하기 때문에
Ajax 요청이 아닐 경우 잘못된 접근이라는 alert 창을 띄어주면 됩니다.
이제 API 요청을 직접 입력하고 들어가면 이렇게 막아줍니다!
처음에는 Filter를 커스텀해서 작성하고 사용하는 게 어려워 보이고 복잡할 것 같아서 손이 가지 않았지만
강사님께 여쭤보고 한번 사용을 해보니 생각보다 어렵지 않아서 생각할 수 있는 폭이 넓어진 것 같습니다
'Spring boot > 위니아에이드 클론코딩 프로젝트' 카테고리의 다른 글
[위니아에이드] 팀 프로젝트 - 인증 실패 설정 (0) | 2022.10.26 |
---|---|
[위니아에이드] 팀 프로젝트 - AOP를 활용한 Validation 체크 (0) | 2022.10.26 |
[위니아에이드] 팀 프로젝트 - 도로명주소 API 활용하기 (0) | 2022.10.26 |
[위니아에이드] 팀 프로젝트 - 비회원 서비스 조회 로직 (0) | 2022.10.25 |
[위니아에이드] 팀 프로젝트 - Stream 활용 (0) | 2022.10.25 |
댓글