Node.js

Iframe을 사용하면 안되는 이유

hazel__ 2022. 8. 10. 23:30

Iframe

An inline frame is used to embed another document within the current HTML document.


iframe HTML 태그는 웹 사이트 내에서 다른 웹 사이트를 보여줄 때 사용한다.

즉, html 파일을 가져와 보여주는 역할을 한다.

마치 노션의 embed 기능과 같다.

 

<iframe src={url} title="title"></iframe>

 

크기 조절

<iframe src={url} height="200" width="300" title="title"></iframe>

<iframe src={url} style={{height: "200", width: "300"}} title="title"></iframe>

 

Target for a Link

<iframe src={url} name="frame_a" title="frame_example"></iframe>

<p><a href={diffUrl} target="frame_a">Different Url</a></p>

a 태그는 클릭으로 페이지를 이동할 수 있다.

다만, target 값으로 iframe의 name 값을 입력하면, iframe 내에서 해당 페이지를 확인할 수 있다.

 

 

Embed


embed 태그는 웹 페이지, 사진, 미디어 플레이어, 플러그인과 같은 외부 자원을 컨테이너로 정의한다.

⛔ 대부분의 브라우저는 더이상 플러그인과 Java Applets을 지원하지 않는다.

사진 → <img>
HTML → <iframe>
video, audio → <video>, <audio>

 

를 권장한다.

 

 

 

iframe을 설명하는 이유는 사용을 권장하지 않기 때문이다! 왜일까?!

 

 

iframe을 사용하면 안되는 이유


iframe은 페이지 내에 다른 페이지를 독립적으로 띄울 수 있다.

이 기능을 사용하여 브라우저 내에서 멀티태스킹을 원할하게 해준다.

즉, 많은 정보를 한 화면에 담아낼 수 있어 자원을 절약할 수 있다.

 

그러나, 현재 사이트에서 다른 사이트를 띄울 수 있기에 악의적인 공격 역시 가능하다.

가장 단순하게는, 많은 수의 iframe을 만들어 웹 사이트에 접근하여 서버에 부하를 가할 수 있다.

 

XSS(Cross Site Scripting) 공격


XSS 공격 역시 가능하다.

크로스 사이트 스크립팅은 공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 하는 것을 말한다.

iframe을 사용하여 악의적인 스크립트를 가지고 있는 사이트를 띄워 놓을 수 있어, 사용자가 접근하여 스크립트에 노출될 수 있다.

 

이는 동일 출처 정책(Same Origin Policy, SOP)으로 해결되었다.

어떤 출처에서 불러온 문서나 스크립트가 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하는 보안 방식이다.

웹 브라우저 보안을 위해 프로토콜, 호스트, 포트가 동일한 서버로만 요청을 주고 받을 수 있도록 한 정책이다.

 

따라서, 같은 서버가 아닌 경우 접근을 차단할 수 있고, iframe 역시 같은 도메인 내에서만 사용해야 한다.

 

 

CORS

Cross Origin Resource Sharing


추가 HTTP 헤더를 사용해서 브라우저가 한 출처에서 실행 중인 웹 애플리케이션에 선택된 액세스 권한을 부여하도록 하는 메커니즘이다.

 

서로 다른 도메인 간의 통신을 허용하는 방법이다.

서로 약속된 도메인과 서버 간의 통신만 허용하기 때문에 안전하게 통신할 수 있다.

 

 

iframe에 관한 내용을 정리하고 보니,

third-party에서 사이트에 접근하는 것 자체를 막아야 한다는 생각이 들었다.

 

악의적으로 수많은 iframe으로 공격한다면, 서버가 내려갈지도…?

 

 

사이트에 대한 접근 자체를 막으려면, 아래의 코드를 사용하면 된다!(Node.js 기준)

 

import helmet from 'helmet';

app.use(helmet.frameguard({ action: 'SAMEORIGIN' }));

frameguard를 사용하여 SAMEORIGIN 일 때만 접근을 허용하는 것이다.

이는 도메인의 주소가 같아야 접근할 수 있다는 것을 의미한다.

 

 

아래 코드 역시 같은 방법이다!

import frameguard from 'frameguard';

app.use(frameguard({ action: 'SAMEORIGIN' }))

 

참고자료


https://studystorage.blogspot.com/2017/02/iframe-1_26.html

 

iframe 보안 문제 우회 및 해결법 1

주제 : iframe, http header 이해과정의 서술 (보안에 대해 쬐금 알게 된것도 ㅎㅎ) 목적: 힘들게 알아보았던 과정을 다시 잊어버리지 않기위한 복기 및 다른 사람들에게 알리는 것 현재 진행하고 있는

studystorage.blogspot.com

 

https://stackoverflow.com/questions/19843085/how-to-block-website-from-loading-in-iframe

 

how to block website from loading in iframe?

Recently i tried to load youtube website in an iframe, but i checked that it's not worked. i used this simple code. <!DOCTYPE html> <html> <head> <title></title> <...

stackoverflow.com

 

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

 

X-Frame-Options - HTTP | MDN

The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a <frame>, <iframe>, <embed> or <object>. Sites can use this to avoid click-jacking attacks, by ensuring that their content is n

developer.mozilla.org

 

 

 

'Node.js' 카테고리의 다른 글

[Node] npm vs yarn  (0) 2022.08.13
[Node] OkPacket 로그 지우기  (0) 2022.07.06
[Node] nodemailer로 이메일 전송하기  (0) 2022.05.29
[42 OAuth] The redirect uri included is not valid.  (0) 2022.01.13
NodeJS + Typescript 환경 세팅하기  (0) 2021.12.19