j_spring_security_check 보안 취약점 관련 문의 드립니다.
- 작성자 :
- 오*영
- 작성일 :
- 2013-05-28 17:56:25
- 조회수 :
- 2,543
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
안녕하세요.
현재 전자정부프레임워크를로 개발된 시스템 운영을 하고 있습니다.
얼마전 보안취약점이 발견되어 이를 어떻게 조치를 해야 자문을 구하고 싶습니다.
로그인시에 아래 부분를 사용하고 있는데,
패킷 캡쳐 프로그램을 이용하면
/j_spring_security_check?j_username=OOOOOO&j_password=xxxxxx
처럼 username과, password 값이 평문으로 보입니다.
이를 암호화문으로 적용하려면 어떻게 하나요?
그럼, 답변 기다리겠습니다.
수고하세요.
현재 전자정부프레임워크를로 개발된 시스템 운영을 하고 있습니다.
얼마전 보안취약점이 발견되어 이를 어떻게 조치를 해야 자문을 구하고 싶습니다.
로그인시에 아래 부분를 사용하고 있는데,
패킷 캡쳐 프로그램을 이용하면
/j_spring_security_check?j_username=OOOOOO&j_password=xxxxxx
처럼 username과, password 값이 평문으로 보입니다.
이를 암호화문으로 적용하려면 어떻게 하나요?
그럼, 답변 기다리겠습니다.
수고하세요.
A
안녕하세요. 오민영님.
우선 웹 상에서 ID/Password를 입력하는 방식의 경우는 위와 같이 GET이든 POST든 패킷 캡쳐 프로그램으로 보면 평문의 데이터가 전송되도록 되어 있습니다.
원칙적으로 막을 수 있는 방법은 SSL(HTTPS)를 적용하여 외부에서 캡쳐가 되더라도 암호화되어 있도록 조치하는 방법을 사용하셔야 합니다.
추가적으로 요청하신 것 처럼 SSL이 아닌 데이터를 암호화하시려면 별도의 웹구간 암호화 솔루션이 필요합니다.
마지막으로, 현재 공통컴포넌트 내부에서 /j_spring_security_check?j_username=OOOOOO&j_password=xxxxxx 로 처리 되는 부분을 secure filter chain 방식으로 변경해 배포되고 있습니다.
하단 조치 내용 또는 현재 배포본 2.0.X 참조
//스프링 시큐리티 로그인
//httpResponse.sendRedirect(httpRequest.getContextPath() + "/j_spring_security_check?j_username=" + loginVO.getUserSe() + loginVO.getId() + "&j_password=" + loginVO.getUniqId());
AuthenticationProcessingFilter springSecurity = null;
@SuppressWarnings("rawtypes")
Map beans = act.getBeansOfType(AuthenticationProcessingFilter.class);
if (beans.size() > 0) {
springSecurity = (AuthenticationProcessingFilter)beans.values().toArray()[0];
} else {
LOG.error("No AuthenticationProcessingFilter");
throw new IllegalStateException("No AuthenticationProcessingFilter");
}
//springSecurity.setContinueChainBeforeSuccessfulAuthentication(false); // false 이면 chain 처리 되지 않음.. (filter가 아닌 경우 false로...)
LOG.debug("before security filter call....");
springSecurity.doFilter(
new RequestWrapperForSecurity(httpRequest, loginVO.getUserSe() + loginVO.getId(), loginVO.getUniqId()),
httpResponse, chain);
LOG.debug("after security filter call....");
그럼, 즐거운 하루되십시오.
감사합니다.
우선 웹 상에서 ID/Password를 입력하는 방식의 경우는 위와 같이 GET이든 POST든 패킷 캡쳐 프로그램으로 보면 평문의 데이터가 전송되도록 되어 있습니다.
원칙적으로 막을 수 있는 방법은 SSL(HTTPS)를 적용하여 외부에서 캡쳐가 되더라도 암호화되어 있도록 조치하는 방법을 사용하셔야 합니다.
추가적으로 요청하신 것 처럼 SSL이 아닌 데이터를 암호화하시려면 별도의 웹구간 암호화 솔루션이 필요합니다.
마지막으로, 현재 공통컴포넌트 내부에서 /j_spring_security_check?j_username=OOOOOO&j_password=xxxxxx 로 처리 되는 부분을 secure filter chain 방식으로 변경해 배포되고 있습니다.
하단 조치 내용 또는 현재 배포본 2.0.X 참조
//스프링 시큐리티 로그인
//httpResponse.sendRedirect(httpRequest.getContextPath() + "/j_spring_security_check?j_username=" + loginVO.getUserSe() + loginVO.getId() + "&j_password=" + loginVO.getUniqId());
AuthenticationProcessingFilter springSecurity = null;
@SuppressWarnings("rawtypes")
Map beans = act.getBeansOfType(AuthenticationProcessingFilter.class);
if (beans.size() > 0) {
springSecurity = (AuthenticationProcessingFilter)beans.values().toArray()[0];
} else {
LOG.error("No AuthenticationProcessingFilter");
throw new IllegalStateException("No AuthenticationProcessingFilter");
}
//springSecurity.setContinueChainBeforeSuccessfulAuthentication(false); // false 이면 chain 처리 되지 않음.. (filter가 아닌 경우 false로...)
LOG.debug("before security filter call....");
springSecurity.doFilter(
new RequestWrapperForSecurity(httpRequest, loginVO.getUserSe() + loginVO.getId(), loginVO.getUniqId()),
httpResponse, chain);
LOG.debug("after security filter call....");
그럼, 즐거운 하루되십시오.
감사합니다.