본문 바로가기
실습/리눅스 서버 + 스프링 부트

HAProxy를 활용한 IFrame 활성화

by 이민우 2021. 9. 26.
728x90
반응형

프로젝트 중 웹 기반 오픈소스의 일부를 IFrame이나 Embed를 활용하여 개발 중인 포탈에 탑재해야 할 요구사항이 생겼다.

 

이에 당연히 IFrame에 src만 넣으면 해결이 되는 문제인 줄 알고 쉽다고 생각했으나, 실제로는 그렇게 녹록치 않았다.

 

대부분의 웹사이트들은 CSRF, 클릭 하이재킹 등의 공격에 대비하기 위하여 웹 사이트가 IFrame에 사용되지 못하도록 막아놓고 있다. 이 정도는 이미 알고있는 내용이었으나, 문제는 로컬에서 운영하는 웹 기반 오픈소스들도 마찬가지일 줄은 몰랐다.

 

물론 이는 소스코드 및 설정 파일로 막혀있기 떄문에,

소스코드가 공개된 오픈소스의 경우 코드 및 설정 파일의 수정을 통해 IFrame을 활성화할 수 있었다.

보안 및 설정 측면에 무지했기 때문에 서로다른 오픈소스 다섯 개에 대하여 IFrame에 탑재가 가능하도록 보안을 해제하는데 2주나 걸렸지만, 결국 해제에는 성공했다.

 

하지만 막상 전부 해제를 했었어도 문제는 남아있었다.

만약 오픈소스를 업데이트할 경우 이러한 작업을 반복해야 했고,

테스트 환경에서는 아무런 에러도 발견되지 않았으나 상용으로 돌릴 경우 어떤 에러가 발생할지 예측이 되지 않았다.

 

그래서 아깝기는 하지만 2주간의 작업을 포기하고, 새로운 방안을 모색했다.

그리고 과장님의 조언을 통해 중간에 Proxy를 두고 IFrame을 막고있는 것들을 해제하면 어떻겠냐는 해결책을 얻었다.

 

다행히 IFrame을 막아놓는 오픈소스들이 거의 비슷한 방식 헤더를 설정하여 IFrame을 막고 있기에

Haproxy를 중간에 두고 헤더값을 변경하는 방식으로 IFrame 활성화가 가능했다.

 

Response-Header 중 IFrame을 막기 위해 사용되는 것은 크게 두 가지였다.

 

  1. X-Frame-Options
  2. SameSite (Set-Cookie)

 

먼저 X-Frame-Options의 경우 다음과 같은 방식으로 헤더 제거가 가능했다.

backend <backend_name>
      http-response del-header X-Frame-Options
      server <server_name> <ip_address>:<port> <ssl verify none> <additional_options>

 

위의 문장을 통해 X-Frame-Options를 제거하고 IFrame에 해당 웹 사이트를 넣을 경우 IFrame 내에서 UI가 뜨게 된다.

 

하지만 SameSite 정책으로 인해 쿠키에 저장된 세션이 IFrame에 저장되지 못하게 되고,

로그인이 필요한 사이트의 경우에는 로그인 세션 유지를 위해 위의 옵션을 변경해주어야 한다.

backend <backend_name>
      http-response del-header X-Frame-Options
      http-response replcae-value Set-Cookie (.*) \1;SameSite=none;Secure
      server <server_name> <ip_address>:<port> <ssl verify none> <options>

위의 문장을 추가하면 기존의 쿠키 속성에 none이 추가된다.

만약 이미 SameSite=lax 등이 설정되어 있어도 동작하는 것을 확인했다.

 

그리고 SameSite=none은 반드시 Secure 속성과 함께 사용되어야 하는데,

이 Secure 속성은 HTTP가 아닌 HTTPS에서만 사용된다.

그렇기에 직접적으로 사용자와 소통하는 frontend는 반드시 HTTPS로 통신되어야 한다.

 

frontend <frontend_name>
       bind <address>:<port> ssl crt <pem_file_location>
       use_backend <backend_name>

*frontend에서는 ssl verify none 옵션이 사용되지 못한다.

 

여기서 활용되는 pem 포멧의 인증서는 어떤 것이든 크게 상관은 없으나,

반드시 개인키, 서버 인증서, 체인/루트 인증서를 통합한 하나의 pem 포멧 인증서여야 한다.

 

그리고 이는 openssl을 사용하면 쉽게 만들 수 있다.

openssl 설치 후 다음 명령어를 차례대로 입력하면 pem 인증서가 만들어지게 된다.

openssl genrsa -out hostname.key 2048
openssl req -new -key hostname.key -out hostname.csr
openssl x509 -req -days 365 -in hostname.csr -signkey hostname.key -out hostname.crt
sudo bash -c 'cat hostname.key hostname.crt >> /etc/ssl/private/hostname.pem'
728x90
반응형

'실습 > 리눅스 서버 + 스프링 부트' 카테고리의 다른 글

JPA  (0) 2021.11.27
Spring Security  (0) 2021.11.07
[스프링부트] Thymeleaf  (0) 2021.09.26
09. MariaDB CRUD_UI  (0) 2021.09.18
08. HAProxy  (0) 2021.05.30