데이터 URI 스킴
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
데이터 URI 스킴은 데이터를 URI 형태로 인코딩하는 방법으로, HTML, CSS, JavaScript 등에서 사용된다. 이 스킴은 `data:[<미디어 타입>][;base64],<데이터>` 형식을 따르며, HTTP 요청을 줄이고 외부 데이터 접근 제한 환경에서 유용하다. 하지만, 캐싱이 어렵고, 데이터 크기가 증가하며, 구형 브라우저에서 지원이 제한적이라는 단점이 있다. 또한 악용될 경우, 사용자 정보 탈취에 사용될 수 있다.
더 읽어볼만한 페이지
- URI 스킴 - HTTPS
HTTPS는 HTTP에 보안 기능이 더해진 통신 규약으로, 웹 브라우저와 서버 간 통신을 암호화하여 보안을 강화하지만, 인증서 비용, 서버 부하, 혼합 콘텐츠 문제 등의 단점도 존재한다. - URI 스킴 - 텔넷
텔넷은 1973년에 정의된 7비트 ASCII 문자 세트를 사용하는 네트워크 프로토콜로, 클라이언트-서버 방식으로 작동하며 TCP 포트 23 또는 2323을 사용하며, 보안 취약성으로 인해 SSH로 대체되고 있다. - 인터넷 표준 - DNSSEC
DNSSEC는 DNS의 보안 취약점을 개선하기 위해 도메인 정보에 디지털 서명을 추가하여 응답 레코드의 무결성을 보장하고 DNS 위장 공격을 막는 기술로, RRSIG, DNSKEY 등 다양한 리소스 레코드 유형을 사용하여 인증 체인을 구성하며 공개 키 암호 방식을 활용한다. - 인터넷 표준 - IPv6
IPv6는 IPv4 주소 고갈 문제를 해결하고자 개발된 차세대 인터넷 프로토콜로, 128비트 주소 체계를 통해 사실상 무한대에 가까운 IP 주소를 제공하며, 주소 자동 설정, 패킷 처리 효율성 향상, 보안 기능 강화 등의 특징을 갖는다.
데이터 URI 스킴 | |
---|---|
일반 정보 | |
이름 | 데이터 URI 스킴 |
유형 | URI 스킴 |
미디어 유형 | text/plain (기본값) |
MIME 유형 | RFC 2397에 의해 정의됨 |
설명 | |
목적 | 작은 파일을 인라인으로 포함 |
특징 | Base64 인코딩 지원 웹 페이지 로딩 속도 향상 가능 외부 파일에 대한 의존성 감소 |
구문 | |
형식 | data:[미디어 유형][;인코딩],데이터 |
예시 | data:text/plain;charset=utf-8,Hello, world! |
설명 | data: 접두사로 시작 [미디어 유형]: 데이터의 유형 (예: text/plain, image/jpeg) [;인코딩]: 데이터 인코딩 방식 (예: base64) 데이터: 실제 데이터 (미디어 유형에 따라 형식 결정) |
장단점 | |
장점 | 외부 파일에 대한 의존성 감소 HTTP 요청 수 감소 웹 페이지 로딩 속도 향상 가능 (작은 파일의 경우) 간단한 이미지, 글꼴, 스타일 시트 포함에 유용 |
단점 | Base64 인코딩으로 인해 파일 크기 증가 캐싱이 어려움 Internet Explorer 7 이하 버전에서 지원하지 않음 긴 URI는 주소 표시줄에 표시될 수 있으며, 보안 문제가 발생할 수 있음 URI 길이 제한으로 인해 큰 파일에 사용하기 어려움 |
사용 예시 | |
HTML | <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w+r8P6ACuQA5BAcHPwKQCAHQjx52htgAAAAASUVORK5CYII=" alt="Red dot" /> |
CSS | body {background-image: url('data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOjo4MP//////z4H94hQgCeotWUltwZmkiHgUc4oxM0bjmRpslYUqmhkewtfM7Hxwj1MDAgCdGpOYlg7QMkGOW+ks5RYwnwnhvNwpcho9PigigseosqnXipK9Pbly9PyPShkihoiykwOTmaHqCR9daPz8lzRKlglEQBZiRscJggkA==');} |
지원 브라우저 | |
지원 현황 | 대부분의 최신 브라우저에서 지원 (참조) |
브라우저 호환성 | MDN 웹 문서 참조 |
참고 자료 | |
RFC | RFC 2397 |
WHATWG | WHATWG Fetch 표준 |
MDN | MDN 웹 문서 |
활용 사례 | |
웹 페이지 최적화 | 작은 이미지, 글꼴, 스타일 시트 등을 인라인으로 포함하여 HTTP 요청 수를 줄이고 웹 페이지 로딩 속도를 향상 웹사이트 속도 향상을 위한 Data URI 사용법 (Treehouse Blog) |
웹 페이지 저장 | 웹 페이지의 모든 리소스를 하나의 HTML 파일로 저장 SingleFile (Chrome 확장 프로그램) SingleFile (Firefox 부가 기능) |
2. 문법
데이터 URI 스킴의 문법은 RFC 2397[5][19]에 정의되어 있으며, `data:[<미디어 타입>][;base64],<데이터>` 형식을 따른다.[5]
- 스킴: `data`로 시작하며 콜론(`:`)이 뒤따른다.
- 미디어 타입 (선택 사항): `text/plain;charset=US-ASCII`가 기본값이다.[6] 세미콜론(`;`)으로 구분된 `attribute=value` 형식의 매개변수를 포함할 수 있으며, `charset` 매개변수를 통해 문자 집합을 지정할 수 있다.[6]
- base64 확장 (선택 사항): `base64`가 세미콜론(`;`)으로 구분되어 추가되면, 데이터가 Base64로 인코딩되었음을 나타낸다.[7] Base64 인코딩된 데이터는 원본 데이터보다 약 33% 더 크다.
- 데이터: 쉼표(`,`)로 앞부분과 구분되며, 실제 데이터를 포함한다. 데이터는 옥텟 시퀀스로 표현되며, URL에서 사용할 수 있는 문자는 ASCII 코드로, 그 외 문자는 퍼센트 인코딩으로 표현한다.[20] Base64 인코딩 시에는 표준 Base64 문자 집합을 사용한다.[7]
최소 데이터 URI는 `data:,`이며, 스킴, 미디어 유형 없음, 길이 0의 데이터로 구성된다.
데이터 URI는 스킴과 경로로 구성되며, 기관 부분, 쿼리 문자열, 프래그먼트는 없다. 미디어 유형, base64 표시기, 데이터는 모두 URI 경로의 일부이다.
몇몇 브라우저 (구글 크롬, 오페라, 사파리, 파이어폭스)는 `charset`과 `base64`의 순서가 반대여도 정상 처리되지만, 인터넷 익스플로러에서는 순서가 바뀌면 안 된다.
3. 사용 예시
3. 1. HTML
HTML 문서 내에 이미지를 삽입할 때 데이터 URI 스킴을 사용하는 예시를 살펴보자.
작은 빨간 점의 base64로 인코딩된 PNG 그림을 포함하는 HTML 조각은 다음과 같다.
```html
```
이 예시는 가독성을 위해 줄 바꿈이 되어 있다. 데이터 URI를 포함한 실제 URI에서는 제어 문자(ASCII 0부터 31까지와 127)와 공백(ASCII 32)은 허용되지 않는다. 즉, 데이터 URI에 공백 문자가 포함되어서는 안 된다.
하지만 HTML4와 HTML5에서는 요소의 속성값 안의 줄 바꿈은 무시된다. 따라서 위의 데이터 URI는 줄 바꿈이 무시되어 정상적으로 처리된다. 이는 HTML의 기능이지 데이터 URI의 기능이 아니므로, HTML 이외의 환경에서는 URI 내의 공백 문자가 무시되는 동작은 사용할 수 없음에 유의해야 한다.
작은 빨간 점의 utf8로 인코딩된 SVG 그림을 포함하는 HTML 조각은 다음과 같다.
```html
```
파비콘은 utf8 인코딩과 SVG 데이터를 사용하여 만들 수도 있으며, 이는 HTML의 'head' 섹션에 나타나야 한다.
```html
3. 2. CSS
CSS에서 `ul.checklist li.complete`와 같이 배경 이미지를 지정할 때 데이터 URI 스킴을 사용할 수 있다. CSS 코드 내에서 `\ + <줄 바꿈>` 형태의 줄 종결자는 다음 줄로 이어짐을 나타내며, CSS 스타일시트 프로세서에 의해 제거되어 데이터 URI는 공백 없이 재구성된다.```css
ul.checklist li.complete {
padding-left: 20px;
background: white url('data:image/png;base64,iVB\
ORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEU\
AAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8\
yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAEl\
FTkSuQmCC') no-repeat scroll left top;
}
3. 3. 자바스크립트
자바스크립트에서 `window.open()` 함수를 사용하여 새 창을 열거나 동적으로 콘텐츠를 생성할 때 데이터 URI 스킴을 활용할 수 있다. 다음은 내부 하위 창을 여는 자바스크립트 문의 예시이다.```javascript
window.open('data:text/html;charset=utf-8,' +
encodeURIComponent( // URL 형식을 위한 이스케이프
''+
''+
'
'
42
'+''
)
);
```
이 스크립트는 내장 데이터를 기반으로 서브 윈도우를 표시하며, 각주 등에 사용할 수 있다. 하지만 인터넷 익스플로러 8과 같은 일부 환경에서는 실행 파일의 보안 제한으로 인해 실패할 수 있으므로 주의해야 한다.
3. 4. SVG
SVG 이미지 내에 다른 이미지를 포함할 때 데이터 URI 스킴을 사용할 수 있다. 다음은 Base64로 인코딩된 JPEG 이미지가 포함된 SVG 이미지의 예이다.```xml
```
4. 장점
데이터 URI 스킴을 사용하면 HTTP 요청 및 헤더 트래픽을 줄일 수 있다.[15] 데이터를 텍스트 형식으로 삽입하기 때문에, 인코딩으로 인한 오버헤드가 발생할 수 있지만, 트래픽 감소 효과가 더 크다. 특히 작은 파일을 여러 개 전송하는 경우, TCP의 슬로우 스타트 방식 때문에 전송 속도가 제한될 수 있는데, 데이터 URI 스킴을 사용하면 이러한 문제를 완화할 수 있다.[15] 다만, HTTP/1.1의 지속적 연결이나 HTTP/2를 사용하는 경우에는 이 장점이 줄어든다.
HTTPS를 사용하는 웹 페이지에서는 브라우저가 모든 다운로드에 대해 보안 연결을 요구하거나 보안 경고를 표시한다.[15] 서버 설정 오류 시 HTTPS 요청은 큰 오버헤드를 발생시킬 수 있는데, 데이터 URI 스킴으로 모든 파일을 하나로 묶으면 이러한 문제를 해결할 수 있다. 또한, 많은 브라우저가 하나의 도메인에 대한 연결 수를 제한하는데, 데이터 URI 스킴은 이러한 제한의 영향을 받지 않는다.[15]
외부 데이터 접근이 제한된 환경이나, HTML 파일 하나로 멀티미디어를 표현해야 하는 경우, 그리고 이메일에서 외부 파일이나 첨부 파일 없이 이미지를 표시해야 하는 경우에도 유용하게 활용된다.
5. 단점
데이터 URI 스킴으로 포함된 파일은 개별적으로 캐시되지 않아, HTML이나 CSS 파일이 다운로드될 때마다 데이터도 함께 다운로드된다. HTML이나 CSS 파일이 갱신될 때마다 인코딩이나 임베딩을 다시 해야 한다.
Base64로 인코딩된 데이터는 원래 크기보다 1/3 정도 커지지만(바이트 단위), HTTP 서버가 응답을 gzip으로 압축했을 경우 2~3%까지 경감된다. 데이터 URI 스킴으로 다운로드한 파일에는 일반 링크에서 다운로드한 파일과 달리 파일 이름이 없다. 저장할 때의 파일 이름은 MIME 타입별로 준비된 기본 이름이 된다. 다만, HTML5에서는 a 요소에 다운로드 시의 파일 이름을 지정할 수 있는 download 속성이 추가되었으므로, 일부 브라우저에서는 이 문제는 해결되었다.
오래된 Internet Explorer에서는 지원되지 않으며, 버전 8에서는 데이터 크기가 32kB로 제한된다. Internet Explorer 버전 8과 버전 9에서는 이미지에서만 사용할 수 있고, JavaScript로 생성된 콘텐츠는 다운로드할 수 없다.
데이터 URI 스킴은 데이터가 단순한 문자열로 표현되므로, 브라우저 등 많은 처리 환경에서는 메타데이터, 데이터 압축, 콘텐츠 협상과 같은 복잡한 처리를 지원하지 않는다. 또한, 데이터 URI 스킴은 안티 바이러스 소프트웨어의 필터링 처리를 어렵게 한다.
6. 브라우저 지원 현황
7. 악용 사례
데이터 URI는 의심하지 않는 웹 사용자로부터 사용자 이름과 비밀번호를 획득하려는 공격 페이지를 구성하는 데 활용될 수 있다.[8] 사이트 간 스크립팅 (XSS) 제한을 우회하여 공격 페이로드를 주소 표시줄 내부에 완전히 포함시키고, 제3자가 관리하는 전체 웹사이트가 아닌 URL 단축 서비스를 통해 호스팅할 수 있다.[8] 결과적으로 일부 브라우저는 data URI로 이동하는 웹 페이지를 차단한다.[9]
참조
[1]
웹사이트
Using Data URIs to Speed Up Your Website
http://blog.teamtree[...]
Treehouse Blog
2014-03-27
[2]
웹사이트
SingleFile - Chrome Web Store
https://chrome.googl[...]
2018-08-25
[3]
웹사이트
SingleFile – Add-ons for Firefox
https://addons.mozil[...]
2018-08-25
[4]
웹사이트
Can I use...
http://caniuse.com/#[...]
2015-08-31
[5]
웹사이트
RFC 2397 - The "data" URL scheme
http://tools.ietf.or[...]
Internet Engineering Task Force
2008-08-12
[6]
웹사이트
Character Sets
https://www.iana.org[...]
Internet Assigned Numbers Authority
2015-08-31
[7]
웹사이트
Uniform Resource Identifiers (URI): Generic Syntax
http://tools.ietf.or[...]
Internet Engineering Task Force
2015-08-31
[8]
뉴스
Phishing without a webpage – researcher reveals how a link itself can be malicious
https://nakedsecurit[...]
Naked Security by Sophos
2012-08-31
[9]
웹사이트
Data URLs - HTTP | MDN
https://developer.mo[...]
Mozilla
2018-05-11
[10]
웹사이트
Using Data URIs to Speed Up Your Website
http://blog.teamtree[...]
Treehouse Blog
2018-08-26
[11]
웹사이트
SingleFile - Chrome Web Store
https://chrome.googl[...]
2018-08-25
[12]
웹사이트
SingleFile – Add-ons for Firefox
https://addons.mozil[...]
2018-08-25
[13]
웹사이트
Can I use...
http://caniuse.com/#[...]
2015-08-31
[14]
웹사이트
Define data: URLs by annevk · Pull Request #579 · whatwg/fetch
https://github.com/w[...]
GitHub
2018-05-26
[15]
웹사이트
RFC 2616 Section 8.1.4
https://datatracker.[...]
Internet Engineering Task Force
2012-12-14
[16]
웹사이트
data Protocol
http://msdn.microsof[...]
Microsoft
2014-03-16
[17]
웹사이트
Binary Compression Rates for ASCII Formats
http://citeseerx.ist[...]
2011-04-07
[18]
웹사이트
Security
https://datatracker.[...]
Internet Engineering Task Force
2008-08-12
[19]
웹사이트
"{{IETF RFC|2397}} - The \"data\" URL scheme"
https://datatracker.[...]
Internet Engineering Task Force
2008-08-12
[20]
웹사이트
Uniform Resource Identifiers (URI): Generic Syntax
https://datatracker.[...]
2012-12-14
[21]
웹인용
Using Data URIs to Speed Up Your Website
http://blog.teamtree[...]
Treehouse Blog
2014-03-27
[22]
웹인용
SingleFile - Chrome Web Store
https://chrome.googl[...]
2018-08-25
[23]
웹인용
SingleFile – Add-ons for Firefox
https://addons.mozil[...]
2018-08-25
[24]
웹인용
Can I use...
http://caniuse.com/#[...]
2015-08-31
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com