>> 참조: http://thermidor.tistory.com/459


2년쯤 전에 위 게시물로 이미 포스팅했었는데, 제목이 다른 주제라서 간혹 필요한 경우에 찾지 못하는 경우가 있다.

그래서 새 제목으로 다시 옮긴다.


최근 Microsoft의 SharePoint나 Exchange OWA 사이트 등의 경우에 주로 해당하는 오류인데...


OWA를 기업 내 인트라넷 포털 사이트와 붙이려면 새 창으로 실행하든가,

아니면 상단의 GNB(Global Navigation Bar)를 날린 다음 iframe으로 구겨 넣어야 하는데

새 창으로 실행하는 경우야 별 문제 없겠지만

iframe으로 넣는 순간 문제가 생긴다. 바로 아래와 같이 표시할 수 없다는 경고가 뻑~ 하고 뜨게 된다.


이 콘텐츠를 프레임에 표시할 수 없습니다. 


이 웹 사이트에 입력한 정보의 보안을 위해서 이 콘텐츠의 게시자가 프레임 내 표시를 허용하지 않습니다.


가능한 해결 방법: 

    새 창에 이 콘텐츠를 엽니다.  


뭐 이런 식의.


이것을 해결하는 방법은 두 가지가 있다.

한 가지는 추가/변경해서 해결하는 방법이고, 다른 한 가지는 없애서 해결하는 방법이다.




무엇을?




문제를 해결하려면,

먼저, 문제가 발생하는 이유부터 알아야 하는데

이 경우는 바로 "X-Frame-Options" 라는 헤더 값 때문이다.


>> 참조: https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options



위 참조 URL을 보면,

다른 사이트에 포함되어 클릭재킹(clickjacking; 일종의 하이재킹) 공격 등을 당할 수 있는 여지를 피하기 위해 원 사이트가 제작 당시 추가한 옵션이라는 건데, 결국 iframe으로 넣지 말라는 제작자의 명시적인 경고인 셈이다. 이걸 어기고 iframe으로 동작이 되게 만드는 것은 결국 또 하지 말라는 걸 하는 것이 되겠다. -_-a


어쨌든, 이 값이 보통 아래와 같이 Response 헤더에 설정되어 있기 때문에 위 오류가 발생하는 것이다.


...

Transfer-Encoding: chunked

X-AspNet-Version: 4.0.30319

X-BackEnd-Begin: 2014-03-26T14:56:14.183

X-BackEnd-End: 2014-03-26T14:56:14.183

X-BEServer: ********

X-CalculatedBETarget: ********.******.com

X-Content-Type-Options: nosniff

X-DiagInfo: ********

X-FEServer: ********

X-Frame-Options: SAMEORIGIN

X-NoBuffering: 1

X-NoCompression: 1

X-OWA-Version: 15.0.775.32

X-Powered-By: ASP.NET

X-UA-Compatible: IE=EmulateIE7

...


굳이 iframe에 넣겠다면, 저 부분을 다른 값으로 바꾸거나 아예 저 헤더 값을 삭제해 버리면 되는 것이다.




* 바꿀 때는 위 참조 URL에 있는 것처럼


X-Frame-Options: ALLOW-FROM http://ep.abcde.com


이런 식으로 iframe의 부모 사이트 DNS 도메인 이름을 "http://"까지 포함해서 정확하게 적어 주면 된다.




* 삭제하는 것은 좀 개발이 필요한 고급 기술인데, 막상 알고 나면 매우 쉽긴 하다.

C# 기준으로 간단하게 설명하자면(사실 실제 작업할 분량은 코드 몇 줄 되지 않는다),

  1. HTTP 헤더를 가로채서 변경할 수 있는 HttpModule 클래스를 하나 만들고
  2. HttpApplication.PreSendRequestHeaders 이벤트를 구현하면 되는데,
  3. 바로 위 X-Frame-Options 헤더를 삭제하는 코드만 만들어 넣으면 된다. 딱 한 줄이다.


만들어진 dll 파일은 Exchange 2013 서버의 Frontend OWA 가상 디렉터리에 있는 web.config에 등록하면 된다.

당연히 <system.webServer> 내의 <modules> 부분에 <add....> 형식으로 등록해야 한다.

(이거 모르면 대략 낭패...)


HttpModule을 만들 때 Exchange 서버에 설치된 .NET Framework 버전과 맞도록 만들어야 하는 것은 부가 팁.

아마 Exchange 2013은 .NET Framework 4.0 버전이었던가? 뭐, 확인은 못하겠지만 대충 맞을 듯.





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]