URL에 직접 접근할 수 없도록 처리
: header 에서 referer 정보를 확인하여 직접 접근 여부 판별이 가능하다.
referer 는 변조가 가능하여 직접 접근을 완벽히 막는 방법이라고 할 순 없을 듯 하나, 보통은 이정도만 처리해도 될 듯 하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String contextPath = request.getContextPath();
if(handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod)handler;
RefererUncheck lefererUncheck = handlerMethod.getMethodAnnotation(RefererUncheck.class);
logger.info("Header Check. (getRemoteAddr=" + StringUtils.trimToNull(request.getRemoteAddr()) + ")");
logger.info("Header Check. (getRequestUrl=" + StringUtils.trimToNull(request.getRequestURI().substring(contextPath.length())));
try {
// URL 접속정보
String referer = StringUtils.trimToNull(request.getHeader("Referer"));
logger.info("referer : " + referer);
// 리퍼럴 어노테이션이 없고, ajax 통신이 아닌경우만 체크
if (lefererUncheck == null && !this.isAjaxRequest(request)) {
logger.debug("Referer Check Start! (Referer=" + StringUtils.trimToNull(request.getHeader("Referer")) + ")");
logger.debug("Referer Check success! (URI=" + request.getRequestURI() + ")");
if (StringUtils.isEmpty(referer)) {
throw new CustomException("error.referer");
}
}
} catch (CustomException be) {
request.getRequestDispatcher(contextPath+ "/cmm/error.jsp").forward(request, response);
return false;
} catch (Exception e) {
logger.error(e.getMessage());
return false;
}
}
return true;
}
private boolean isAjaxRequest(HttpServletRequest request) {
final String header = request.getHeader(Constants.AJAX_HEADER);
if( header != null && header.equals("true") ) {
return true;
}
return false;
}
|
cs |
반응형
'back > java' 카테고리의 다른 글
[JAVA] 직렬화 (0) | 2022.04.15 |
---|---|
[java] 메소드 안에서 제어문 없는 중괄호 {} 의 쓰임 (0) | 2020.09.07 |
[Java] Stream 스트림 문법 정리 (0) | 2020.04.29 |
Error 와 Exception의 차이, Unchecked Exception 과 Checked Exception의 차이 (0) | 2020.03.26 |
HttpUrlConnection 모듈 (리펙토링) : 빌더패턴과 프록시패턴 사용 (0) | 2020.02.21 |