<iframe src="http://www.naver.com"></iframe>

 

네이버를 아이프레임에 넣으면 빈 화면만 표시된다.

굳이 이런것까지 막을 필요가 있을까 싶겠지만, 간단하게 자바스크립트로 작성한 프레임(주로 iframe)을 이용한 디도스 공격을 시도한다면 그대로 당할 수 밖에 없다.

이러한 사소한 공격이라도 예방하려면 사이트가 프레임 또는 아이프레임에 표시되지 않도록 해야 한다.

또한 이 방법은 클릭재킹공격(Clickjacking Attact)에 대한 예방효과도 있다.

 

 

 

자바스크립트를 이용한 방법

<script type="text/javascript">

    if(top != window) {

        top.location window.location;

    }

</script>

 

 

 

메타 태그를 이용한 방법

<meta http-equiv="X-Frame-Options" content="deny" />

 

 

 

서버사이드 확장헤더를 이용한 방법

 

PHP

  header("X-Frame-Options: DENY");

 

Java

  HttpServletResponse res = (HttpServletResponse)response;

  res.addHeader("X-FRAME-OPTIONS""DENY");

 

C#

  this.Response.Headers["X-FRAME-OPTIONS"] = "DENY";

  또는

  HttpContext.Current.Response.AddHeader("x-frame-options""DENY");

 

X-Frame-Options 확장헤더에 사용되는 값

  DENY : 해당 페이지를 frame에 표시할 수 없게 한다

  SAMEORIGIN : 해당 페이지와 동일한 orgin에 해당하는 frame만 표시 한다

  ALLOW-FROM uri : 해당 페이지는 지정된 orgin에 해당하는 frame만 표시 한다



Http Server를 이용한 방법


Apache

  • Header always append X-Frame-Options SAMEORIGIN 

Nginx 

  • add_header X-Frame-Options SAMEORIGIN;

위와 같이 설정하면 된다. 나 또한 위 설정을 통해 X-Frame-Options 설정을 변경했다. 그런데 문제가 해결되는 것이 아니라 또 다른 문제가 생겼다.

Multiple 'X-Frame-Options' headers with conflicting values ('SAMEORIGIN, DENY')

http 응답 헤더를 분석했더니 DENY와 더불어 또 하나의 SAMEORIGIN 설정이 추가되어 충돌이 발생하는 상황이었다. 아무리 DENY 설정을 제거하려고 삽질을 해봤지만 제거되지 않았다.

1시간 동안 Apache 웹 서버와 삽질하다가 혹시 Apache가 아니라 뒤에 연결되어 있는 Tomcat 서버의 응답 헤더에 DENY 설정이 포함되어 있는 것은 아닐까라는 의심을 하게 되었다.

> curl -I http://localhost:8080

위와 같이 명령을 실행해 응답 헤더를 확인하니 떡하니 DENY 설정이 추가되어 있다. 이럴 때의 허무함이란..

다시 Tomcat에서 X-Frame-Options 설정 시작했다. Tomcat은 기본 값으로 X-Frame-Options 설정을 DENY로 설정하고 있었다. 이 문제를 해결하기 위해 Servlet Filter를 추가해 해결했다.

public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("X-Frame-Options", "ALLOW-FROM https://apps.facebook.com");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

위와 같이 설정하니 X-Frame-Options가 정상적으로 변경되는 것을 확인했다. chrome은 아직까지 ALLOW-FROM 설정을 인식하지 못해 무시해 버리기 때문에 정상적으로 동작한다. 다룬 브라우저도 정상적으로 동작... 오늘 오전의 삽질 경험을 공유해 본다.





spring security 버전 업그레이드 후에 X-Frame-Options이 http header에 추가되어 iframe으로 동작하던 기능이 정상적으로 동작하지 않는 이슈가 발생했다.

얼마 전 X-Frame-Options to DENY 설정 때문에 iframe을 통해 접근할 수 없는 문제 해결 글에서도 관련 이슈를 등록했던 적이 있다. 이 문제를 해결하면서 이전에 추가하지 않던 header를 tomcat에서 갑자기 추가하지는 않을 것으로 예상했다. 그냥 의구심만 가지고 지나쳤다가 다른 iframe 이슈를 해결하다 X-Frame-Options header를 spring security가 보안 이슈를 해결하기 위해 추가한다는 것을 알게 되었다.

가능하면 iframe을 사용하지 않으면 좋겠지만 그렇지 않은 경우 다음과 같이 X-Frame-Options header 추가하는 부분을 다음과 같이 disable 함으로써 문제를 해결할 수 있다.


http.headers().frameOptions().disable()



PS.. Apple Safari 11 에서는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다.

(TypeError: 'undefined' is not an object (evaluating 'window.indexedDB.open')


'Java > JSP' 카테고리의 다른 글

[SVN] SVN 에러 E155004, E200030 등등  (0) 2019.01.15
Jquery-selector-정리  (0) 2019.01.10
IndexedDB 참고사이트  (0) 2019.01.07
WebGL 프로젝트 빌드 및 실행 WebGL 브라우저 호환성  (0) 2019.01.07

+ Recent posts