(이 글을 이미 작년-2013년 가을에 썼었는데 올리지 못하고 있다가 이제서야 다시 정리해서 올린다)




Exchange 2013 OWA는 더 이상 커스터마이징을 거부한다.


일단 자바스크립트와 CSS가 죄다 난독화(Obfuscation packing) 되어 있는 데다

3개월에 한 번씩 주기적으로 CU1, CU2, ... 등으로 업데이트하면서 코드를 몽땅 다 갈아엎어 버리기 때문에

커스터마이징을 하는 순간, 매번 새로 커스터마이징 작업을 해야 하는 어마어마한 관리/유지보수 비용이 추가될 수밖에 없는 구조가 되었다.


그럼에도 불구하고 커스터마이징을 하려고 시도하는 회사들이 종종 있다.

대표적인 경우가 최근 메일 시스템 교체 작업을 시도했다가 이것저것 하도 안 맞는 부분이 많아

결국 통째로 전면 재검토에 들어가 수십 억을 들여 진행됐던 프로젝트를 무효화 시켜버린 굴지의 대기업도 있고...


아무튼

굳이 하겠다면 도시락 싸 들고 다니며 말릴 이유는 없고,

OWA 커스터마이징의 대표적인 경우인 iframe 삽입에 대해서만 간단히 팁을 써 보도록 하겠다.


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 버전이었던가? 뭐, 확인은 못하겠지만 대충 맞을 듯.




마지막으로,

Exchange 2013 OWA를 iframe으로 넣으면 위 문제 말고도 기타 수많은 문제가 발생하게 된다.

IE9 이하 버전의 경우,
iframe으로 OWA를 실행할 때마다(새로고침이다...) 메모리가 폭증한다든가(이건 이제 수정됐으려나...?),
이유 없이 브라우저가 스크립트 에러를 뱉어내고 죽는다든가... 등등.

왠만하면 OWA를 아웃룩(Outlook)처럼 그냥 있는 그대로 쓰는 것이 여러모로 좋다.
정 아쉽다면 회사 로고 이미지 정도만 바꿔서.




Posted by 🐮Thermidor™ 떼르미

댓글을 달아 주세요



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