본문 바로가기
네트워크2

data: URL Scheme vs Protocol

by 로맨틱스터디 2025. 11. 16.
728x90
반응형

이건 URL 구조, 스킴(Scheme), 프로토콜 개념을 헷갈리기 쉬운 주제라서
정확히 정리해드릴게요 👇


✅ 1. “data:”는 진짜 스킴(Scheme)이 맞습니다

예:

data:text/plain;base64,SGVsbG8gV29ybGQ=

 

여기서 data:는
브라우저에서 공식적으로 지원되는 URL Scheme 중 하나예요.

 

즉:

  • http://호스트정보
  • https://호스트정보
  • data:
  • mailto:
  • javascript:
  • file://호스트정보
  • ftp://호스트정보

이런 것들 모두 **스킴(Scheme)**입니다.

 

Q. data:text/palin;base64,SGVsbG8V29ybGQ=

더보기

data: URL은 처음 보면 구조가 헷갈리기 쉽지만
표준이 정해져 있어요.


✅ 1. 이건 “data URL” 이라고 함

예:

 
data:text/plain;base64,SGVsbG8gV29ybGQ=

이 문자열 하나가 URL입니다.
근데 네트워크 요청(HTTP 같은 것)이 전혀 일어나지 않습니다.


✅ 2. data URL의 공식 구조

data URL은 다음 구조를 가집니다:

data:[<MIME-type>][;charset=<encoding>][;base64],<data>

 

너가 준 예시에 적용하면:

 
 

✅ 3. 각 부분 설명


✔ 1) data: → 스킴(scheme)

이 URL은:

  • 인터넷에서 파일 가져오는 게 아니라
  • URL 자체 데이터가 포함되어 있다

는 것을 의미함.

 

즉, 이 URL을 열면 -> 브라우저는 서버가 아닌 URL 내부에서 데이터를 읽음.


✔ 2) text/plain → MIME 타입

데이터의 종류가 "평문 텍스트"라는 뜻.

 

만약 JPEG였다면:

data:image/jpeg;base64,....

 

HTML이면:

data:text/html;base64,...

이미지, 오디오, 폰트 등 거의 모든 MIME 타입 가능.


✔ 3) ;base64 → 인코딩 방식

데이터 부분이 base64로 인코딩되어 있다는 표시.

 

base64를 쓰는 이유:

  • 바이너리 URL에서 표현할 수 없음 → base64 필요
  • 안전하게 텍스트로 전달하기 위해

✔ 4) SGVsbG8gV29ybGQ= → 진짜 데이터

이게 base64로 인코딩실제 콘텐츠.

 

직접 디코딩해보면:

Hello World

✔ data URL은 네트워크 요청이 없다

브라우저이 URL을 여는 순간:

  • 서버로 절대 요청하지 않음
  • 로컬에서 즉시 base64 디코딩하여 렌더링

그래서 DevTools Network 탭에서도 요청이 뜨지 않음.


🔍 data URL과 blob URL 차이 (중요)

비교 항목 data: blob
데이터 위치 URL 문자열 내부 브라우저 메모리 내부
속도 느릴 수 있음(문자열 큼) 매우 빠름
데이터 크기 커지면 비효율적 대용량 처리 가능
생성 방식 문자열 자체 작성 URL.createObjectURL() 필요
보안 스키마만 있으면 어느 페이지에서나 사용 가능 동일 출처(origin) 제한

🔥 최종 정리

data:text/plain;base64,SGVsbG8gV29ybGQ= 의 의미는:

"이 URL 안에 base64로 인코딩Hello World라는 텍스트 데이터가 들어 있으니
그 텍스트바로 브라우저에서 표시하라"

라는 뜻입니다.


원하면:

  • data URL과 blob URL의 장단점
  • data URL 최대 크기 제한
  • 이미지에서 data URL 사용 예시
  • HTML 내부에서 data URL src 사용하는 법

도 이어서 설명해줄게!

 

Q. http 프로토콜 범위

더보기

결론부터 딱 말하면:

✅ “프로토콜”은 https 까지다.

즉,

  • 프로토콜 이름 = https
  • 스킴(scheme) = https
  • 스킴 뒤의 :구분자
  • // 는 “authority(호스트 정보) 시작”을 나타내는 URL 문법 요소

🧩 URL 구조 공식 표준( RFC 3986 )

URL 일반 구조는 다음과 같아요:

 
scheme : //authority /path ?query #fragment

 

따라서:

✔ 프로토콜/스킴

https

스킴 구분자

:

✔ authority(호스트 도메인, 포트 등) 시작을 뜻하는 문법

//

📌 정리하면

부분의미
https 프로토콜(스킴)
: 스킴 구분자
// authority(도메인) 시작 표시
example.com 호스트

 

그래서 전체적으로:

https:      //example.com
 ↑           ↑
프로토콜  //authority 시작


❗️왜 프로토콜에 :// 를 포함하지 않냐?

많은 사람들이 “프로토콜 = https://” 로 착각하는 이유는
URL을 사람이 읽을 때 자연스럽게 묶어서 보기 때문이지만
표준에서 “프로토콜(스킴)” 자체는 콜론(:) 앞에 있는 것만입니다.

 

예:

  • http:// → 프로토콜 = http
  • https:// → 프로토콜 = https
  • ftp:// → 프로토콜 = ftp
  • file:/// → 프로토콜 = file
  • data:... → 프로토콜 = data (// 없음)
  • mailto:... → 프로토콜 = mailto (// 없음)

🎯 최종 결론

프로토콜은 https 까지가 맞다.

  • “https:”는 스킴 + 구분자
  • “https://”는 스킴 + 구분자 + authority 시작 표시

원하면 URL 전체 구조를

scheme://userinfo@host:port/path?query#fragment


형태로 하나하나 분해해서 설명해줄게!

 


 

Q. authority & file:///

 

URL 문법에서 authority, file:/// 의 슬래시 3개는 많은 사람들이 헷갈리는 부분이라
RFC(표준) 관점에서 정확하게 정리해드릴게요.


✅ 1. URL에서 “authority”는 왜 host(도메인)를 의미하나요?

표준 URL 구조는 다음과 같아요 (RFC 3986):

 
scheme ":" "//" authority path? query? fragment?

 

그리고 authority아래 3가지 요소한 덩어리로 묶어 부르는 이름입니다:

authority
= [userinfo "@"] host [":" port]
= 사용정보@도메인:포트번호

 

즉,

authority =

  • 사용자 정보 (예: id:pw@)
  • 호스트(도메인 또는 IP)
  • 포트번호

이 3개가 들어가기에 최상단 "권한 정보를 나타내는 블록" 이라는 뜻에서 authority 라고 부릅니다.

 

예:

https://user:pass@example.com:8080/path
            ↑----------------------------↑
                               authority
 
일반적인 URL에서는 userinfo와 port가 생략되어

authority = host 처럼 보이는 것뿐입니다.


🔍 즉, host 자체가 authority는 아님

authority라는 “큰 이름에 > host가 포함된 것.


✔ 예시 비교

URL 요소 authority 구성
https://example.com example.com host만 있음
https://example.com:444 example.com:444 host + port
https://id:pw@example.com:444 id:pw@example.com:444 userinfo + host + port

그래서 authority는 host의 상위 개념입니다.


✅ 2. file:/// 가 왜 / 가 3개?

이것도 표준을 보면 너무 명확해져요.

URL 기본 문법

scheme ":" "//" authority path

file: 스킴도 일반 URL 문법을 따르긴 하는데

 

문제는…

👉 file 스킴에는 authority(도메인)라는 개념이 거의 필요 없다.
로컬 파일을 여는 거니까 도메인 같은 게 없음.

그래서 대부분 브라우저에서 authority 자리에 빈 문자열을 넣습니다.

 

즉:

file:// + (빈 authority) + /path

 

그러면 형태가 이렇게 됨:

file:// + /C:/Users/...

 

결국:

file:///C:/Users/...

이렇게 슬래시가 세 개가 되는 이유는:

✔ 두 개는 URL 문법의 "//"

✔ 한 개는 실제 path 시작 "/"

 

즉:

 
file:
   //
     /C:/path

슬래시 3개 =
권한부(authority) 시작 표시(//) + 빈 authority + 경로 시작(/)


📌 “호스트 정보에 /가 포함되나?” → 아닙니다.

file:/// 의 세 번째 / 는 host의 일부가 아니라
authority가 빈 값이기 때문에 path가 바로 시작되면서 생긴 슬래시입니다.


📦 다른 예시들

✔ authority가 있을 수도 있음 (드물지만 존재)

file://localhost/etc/passwd

authority = localhost
path = /etc/passwd


🎯 최종 정리

🔹 authority는 host가 아니라

userinfo + host + port 를 하나로 묶은 이름

🔹 file:/// 에서 슬래시 3개는

  • // → authority 시작 문법
  • / → authority가 없으므로 path가 바로 시작되며 생긴 슬래시

결코 “호스트에 슬래시가 들어간다”는 뜻이 아님.


원하면

  • URL 전체 구조를 직접 예제로 쪼개서 보여주거나
  • authority가 필요한 이유
  • file URLOS마다 어떻게 다르게 해석되는지 (윈도우/리눅스/맥)

도 설명해줄게!


✅ 2. 그럼 “Scheme = Protocol”이냐?

정확히는 NO.

 

Scheme(스킴)은 URL의 형태를 정하는 규칙 이름이고
그 스킴이 “프로토콜을 사용하는 경우도 있고, 아닌 경우도 있다”입니다.

예: 스킴 = 프로토콜이 같은 경우

http:// → HTTP 프로토콜 사용
https:// → HTTPS(HTTP over TLS) 프로토콜 사용
ws:// → WebSocket 프로토콜 사용
 

예: 스킴이지만, 네트워크 프로토콜이 없는 경우

data: → 네트워크 연결 없음 (데이터 인라인 삽입)
javascript: → JS 코드 실행
file: → 로컬 파일 접근
mailto: → 이메일 클라이언트 실행
blob: → 브라우저 내부 URL, 네트워크 없음
 

📌 즉,

모든 프로토콜은 스킴이 될 수 있지만,
모든 스킴이 프로토콜은 아니다.


간단한 비유

  • 스킴(Scheme) = “이 URL을 어떻게 해석할지 정하는 안내 문구
  • 프로토콜(Protocol) = “브라우저와 서버가 어떻게 통신하는지에 대한 규칙”

✅ 3. “data:” 스킴은 어떤 프로토콜을 쓰냐?

아무 네트워크 프로토콜도 사용하지 않습니다.

브라우저가 URL 안에 직접 포함된 데이터를 그대로 해석합니다.

 

예:

data:image/png;base64,iVBORw0KGgo...

 

이건 이미지 파일네트워크 없이 URL 내부에 직접 포함한 형태입니다.

 

그래서:

  • 요청 없음
  • 서버 통신 없음
  • CORS 없음
  • 네트워크 탭에 아무 요청도 안 뜸

🔍 Protocol 컬럼에 data:가 뜨는 이유는?

DevTools의 Protocol 컬럼은 "HTTP/1.1, h2, h3"처럼 네트워크 프로토콜을 의미합니다.
data:는 네트워크 요청이 아니므로

➡ Protocol 자체가 없음
➡ DevTools에서는 그냥 “(생략)”하거나 “other”로 표시되기도 함


🎯 정리

✔ URL Scheme = URL이 어떤 식으로 해석될지 정하는 이름

✔ Scheme가 반드시 네트워크 프로토콜과 1:1 대응하는 건 아님

✔ data:는 네트워크 프로토콜이 아닌 “인라인 데이터 스킴

✔ 프로토콜이 없기 때문에 요청도 없음


원하시면
URL 구조(scheme://userinfo@host:port/path?query#fragment)를
하나씩 분석해서 알려드리거나
blob: / data: / file: / javascript:의 차이도 설명해드릴게요!

 

Q. URL / Scheme / Protocol

더보기

URL / Scheme / Protocol 은 비슷해 보이지만 범위가 완전히 다릅니다.


✅ 1. “Protocol = 네트워크 규약만 해당하는 거 맞아?”

✔ 정확히 맞습니다.

**Protocol(프로토콜)**이란
두 컴퓨터네트워크로 어떻게 통신할지 정하는 규칙입니다.

 

따라서:

  • 네트워크 연결이 있으면프로토콜이 존재함
  • 네트워크 연결이 없으면 → 프로토콜 없음

예:

상황 프로토콜 있음? 사용되는 프로토콜
https://example.com 있음 HTTPS (HTTP over TLS)
ws://example.com 있음 WebSocket
ftp://… 있음 FTP
data: ❌ 없음 네트워크 사용 안함
file:///C:/... ❌ 없음 로컬 파일
blob: ❌ 없음 브라우저 내부 URL

즉, data: 같은 스킴은 네트워크 요청이 아예 없으니 Protocol 컬럼 자체가 없다고 보면 됩니다.


✅ 2. “Protocol에는 http/https 말고 뭐가 있어?”

네. 훨씬 더 많아요.
프로토콜은 "네트워크 통신 규칙"이니까 종류가 매우 많죠.

🌐 애플리케이션 레벨 프로토콜

  • HTTP
  • HTTPS
  • WebSocket (ws://, wss://)
  • FTP
  • SMTP
  • IMAP
  • POP3
  • SSH
  • TLS / SSL
  • QUIC (HTTP/3가 사용하는 전송 프로토콜)

📡 전송 계층 프로토콜

  • TCP
  • UDP
  • SCTP
  • QUIC (전송 계층 역할도 수행)

📦 인터넷 계층

  • IP
  • IPv6
  • ICMP

🕸 링크 계층

  • Ethernet
  • Wi-Fi
  • Bluetooth Low Energy 등등

즉, HTTP/HTTPS는 그 중 “웹 브라우저에서 가장 흔한 애플리케이션 프로토콜”일 뿐입니다.


✅ 3. “Scheme은 URL이 어떻게 해석될지 정하는 이름” → 그 ‘어떻게 해석될지’가 뭐야?

즉, 브라우저 그 URL을 어떤 방식으로 처리할지를 결정하는 신호입니다.

 

예를 들어:

✔ http://

→ 서버에 HTTP 요청 보내라
→ TCP 80 포트 기본 사용
HTML 페이지 받아라

✔ https://

→ 서버에 HTTPS 요청 보내라
TLS 핸드셰이크 먼저
암호화된 상태에서 HTTP 요청

✔ ws://

WebSocket 연결을 핸드셰이크로 업그레이드

✔ file://

로컬 디스크의 파일OS를 통해 읽어라
→ 네트워크 연결 없음

✔ data:

URL 자체에 포함된 데이터를 디코딩해서 그대로 표시해라
→ 네트워크 없음

✔ mailto:

OS의 이메일 앱을 띄워서 메일 보내기 창 열어라
→ 브라우저는 네트워크 요청 안 함

 

결국:

Scheme은 URL을 입력했을 때 브라우저가 ‘무슨 행동’을 해야 하는지 정의한다.


✅ 4. “URL은 네트워크 주소창에 입력하는 거 아니었나? 네트워크랑 상관없는 것도 URL이야?”

맞아요.

많은 사람이 "URL = 웹 주소 = 인터넷 주소"라고 생각하는데
실제로는 그렇지 않습니다.

 

URL은 “리소스를 식별하는 문자열”일 뿐이고,
그 리소스네트워크에 있을 필요는 없습니다.

 

따라서 다음도 모두 URL입니다:

  • file:///Users/me/test.txt로컬 파일
  • data:text/plain;base64,SGVsbG8= → 데이터 내장
  • blob:https://example.com/12345브라우저 내부 객체
  • javascript:alert('hi') 코드 실행

이런 URL들은 네트워크를 사용하지 않아요.
즉, "인터넷 주소창에 쓰면 브라우저가 다루는 문자열"이지
필수적으로 인터넷 요청이 필요한 건 아닙니다.


🎯 핵심 요약

✔ Protocol = 네트워크 통신 규약

네트워크가 있어야 존재함.

✔ Scheme = URL을 어떻게 처리할지 정하는 신호

네트워크 여부와는 무관.

✔ URL = 리소스를 식별하는 문자열

리소스가 인터넷에 있지 않아도 됨.

data:, file:, blob:, javascript: 도 모두 URL 스킴

하지만 프로토콜은 없음.


원하면

  • URL vs URI vs URN 차이
  • 브라우저 주소창에서 스킴 생략 시 어떻게 동작하는지
  • 스킴을 직접 새로 만드는 법 (커스텀 URL 스킴)
    도 설명해줄게!

Q. blob:https://example.com/12345blob: URL 은 외형은 보통 URL처럼 보이지만 HTTP 요청 주소가 아닙니다.

더보기

그래서 브라우저 내부 객체라고 부르는 이유가 있어요.

 

아주 정확하게 설명해볼게요 👇


✅ 1. blob: URL 은 “브라우저 내부 메모리에 저장된 데이터에 붙이는 임시 주소”이다

예:

blob:https://example.com/12345

이렇게 생겼지만 HTTP 요청이 일어나지 않습니다.

 

왜냐하면:

  • https://example.com이 blob을 만든 페이지의 출처(origin) 이고,
  • 12345 는 브라우저 메모리에 저장된 데이터 객체의 랜덤 ID입니다.

즉,

blob URL = 브라우저 내부 메모리에 저장된 객체를 가리키는 식별자

 

예를 들어,
JS에서 파일을 읽거나(파일 선택), fetch로 바이너리를 가져오거나, canvas를 이미지로 변환할 때
브라우저는 그 데이터 메모리에 넣고 -> 그 메모리 주소 blob URL 이름(tag) 을 붙입니다.


✅ 2. 그래서 blob URL은 HTTP 요청 주소가 아니다

외형은 다음처럼 "protocol://host/path"처럼 보이지만,

blob:https://example.com/12345

아래처럼 "프로토콜://호스트/패스" 구조를 흉내내는 것일 뿐이고

실제로는 어디에도 네트워크 요청이 날아가지 않습니다.

 

DevTools Network 탭에 보면:

  • blob URL 로 접근해도 요청이 없음
  • status code 없음
  • protocol도 없음
  • 서버 로그에도 기록되지 않음

왜?

-> blob URL은 프로토콜이 아니라 내부적으로 브라우저가 해석하는 pseudo-scheme(가짜 스킴) 이기 때문입니다.


🔍 그럼 blob: 뒤에 붙는 https://example.com 은 뭐야?

이건 blob을 만든 페이지의 origin(출처) 을 나타내는 것입니다.

 

즉,

blob:<origin>/<unique-id>

형태예요.

 

이 origin 정보가 필요한 이유:

  • blob URL 은 만든 origin 이 아니라면 접근할 수 없음 (보안 때문)
  • cross-origin 제한(CORS)처럼 blob 도 동일 출처 제한 적용됨

그래서 다음은 서로 접근 불가:

blob:https://example.com/abcde
blob:https://othersite.com/zzzzz

서로 완전히 다른 메모리 객체입니다.


✅ 3. blob URL 은 언제 쓰이는지

브라우저 내부 객체를 나타낼 때 사용합니다:

✔ (1) 파일 업로드 미리보기

URL.createObjectURL(file)

→ blob: URL 생성됨

✔ (2) canvas이미지로 저장할 때

canvas.toBlob(...)

✔ (3) fetch 로 바이너리(2진수) 받아서 URL로 변환할 때

예: 이미지, 영상, pdf blob

✔ (4) 웹앱에서 큰 파일을 임시 보관할 때

즉,
사용자 컴퓨터 메모리 안에 있는 임시 파일을 -> 웹 브라우저가 URL 형식으로 접근하게 하는 방식이에요.


🔥 핵심 정리(아주 중요)

✔ blob URL은 HTTP 요청 주소가 아니다

✔ 네트워크 통신이 아예 일어나지 않는다

브라우저 내부 메모리 객체를 가리키는 “가짜 URL”이다

외형은 URL 형태지만 Protocol 이 아니다

originblob 을 만든 페이지의 출처 표시용


원하면:

  • blob: vs data: vs file: vs filesystem: 차이
  • Blob URL 이 메모리에서 언제 제거되는지(garbage collection)
  • 왜 blob URL 은 페이지 닫히면 사라지는지

 

blob URL이 브라우저 메모리에 저장된 객체와 어떤 관계인지 혼란스러울 수 있는데
정확하게 정리해드릴게요.


🎯 핵심 개념 요약

blob:https://example.com/12345

 

이건 데이터 자체도 아니고,
origin 표시만 있는 것도 아니고,
메모리 주소를 직접 노출한 것도 아니고,

👉 브라우저 내부에서 “해당 데이터 객체를 참조할 수 있는 임시 키(토큰)” 입니다.

 

즉,

blob URL은 브라우저가 만든 임시 ID로,
해당 blob 데이터를 찾아갈 수 있는간접적인 접근자(handle)” 역할만 함.


🔍 1. blob URL = 데이터 그 자체는 아님

예:

blob:https://example.com/12345

이 문자열은 단지 “key” 역할을 합니다.

 

이 URL을 열면 브라우저는:

  1. 내부 Map 같은 구조에서
    키 "12345" 에 해당하는 Blob/Data 객체를 찾고
  2. 그 객체를 브라우저에서 렌더링하거나 다운로드하게 만듦

즉,
blob URL은 데이터의 실제 내용이 아니라, 데이터의 ‘식별자’ 느낌에 가깝다.


🔍 2. blob URL 은 origin(출처) 표시가 맞다

blob:https://example.com/

여기서 https://example.com
이 blob URL을 생성한 페이지의 출처를 나타냅니다.

 

이 origin 정보는 보안 정책 때문이에요:

  • 다른 origin의 페이지에서 blob URL을 열 수 없음
  • 예: blob:https://a.com/b.com 페이지에서 열면 에러

즉,
blob 데이터는 동일 출처(origin) 정책을 따른다.


🔍 3. blob URL 은 “메모리 주소”가 아니다

여기서 중요한 부분:

❌ blob URL은 실제 메모리 주소를 노출하지 않음

(보안상 절대 불가능)

실제 브라우저 내부는 대략 이렇게 동작함:

 
internalMap = {
  "12345": Blob(binary data),
  "87abc": Blob(image data),
  ...
}

blob:https://example.com/12345
→ internalMap["12345"]에 접근하는 방식.  // Blob(binary data)

 

즉,

  • blob URL은 메모리 객체에 접근하는 “키”
  • 메모리 주소는 절대 사용자에게 공개되지 않음
  • 브라우저 내부에서 안전하게 관리

🔍 4. blob URL을 통해 데이터에 접근 가능하다.

네, URL을 열면 blob 데이터에 접근 가능합니다.

 

예:

const url = URL.createObjectURL(file);
img.src = url; // 이미지 표시됨
img.src = URL.createObjectURL(file);

브라우저는 내부적으로 blob 데이터를 찾아 이미지로 렌더링합니다.

 

하지만 blob URL은:

  • 원래 페이지에서만 접근 가능
  • 페이지를 새로고침하면 사라짐
  • 브라우저를 닫으면 사라짐
  • 복사해 다른 브라우저 탭에서 열면 불가능 (출처 다르므로)

즉,

접근 가능하긴 하지만
서버 주소”처럼 영구적이고 글로벌하게 접근 가능한 게 아님.


🔍 5. blob URL은 보통 이렇게 생성됨

예 1. 파일 선택

 
input.onchange = () => {
  const url = URL.createObjectURL(input.files[0]);
}

 

예 2. fetch로 받은 바이너리

const blob = await response.blob();
const url = URL.createObjectURL(blob);

 

예 3. canvas → blob

canvas.toBlob(blob => {
  const url = URL.createObjectURL(blob);
});

🔥 최종 정리(중요)

✔ blob URL은 데이터 자체가 아니다

→ 데이터는 브라우저 메모리에 저장되어 있음

✔ blob URL은 그 데이터를 가리키는 “키(참조자)”이다

→ 브라우저 내부 Map에서 lookup 사용

✔ blob URL에는 origin 정보가 담긴다

→ 보안상 동일 출처만 접근 가능

✔ blob URL로 데이터에 접근 가능하다

→ 하지만 서버가 아닌 브라우저 로컬 메모리에서 가져옴

✔ 절대 메모리 주소를 직접 노출하지 않는다

→ 브라우저가 관리하는 안전한 lookup 구조


원하면
“blob URL이 어떻게 ‘해제(revoke)’ 되는지”,
“GC와 blob URL 관계”,
“data: URL과 blob: URL의 차이”
도 이어서 자세히 설명해줄게!

 

 

data:img/gif

data:image/gif;base64,R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw==

✅ 1. data: URL에서 base64는 “필수”가 아니다

많은 예제들이 ;base64 를 쓰다 보니
“data URL은 다 base64여야 하나?”라고 생각하기 쉬운데 아님.

✔ base64는 선택이다

data URL은 아래 두 가지 방식이 모두 가능함:

 

텍스트 그대로 삽입 (URL-safe 문자만 가능)

data:text/plain,Hello%20World

 

base64 인코딩

data:text/plain;base64,SGVsbG8gV29ybGQ=

 

base64는 옵션일 뿐이고, 꼭 써야 하는 건 아님.


✅ 2. GIF·PNG·JPG 같은 바이너리는 거의 무조건 base64 사용

이미지/바이너리 데이터는:

  • 0x00~0xFF 임의 바이트 존재
  • URL로 직접 넣을 수 없음
  • URL-safe 문자로 변환 필요

그래서 보통 base64로 인코딩함.

예:

data:image/gif;base64,R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw==

이 문자열을 base64 디코딩하면 1×1 픽셀짜리 GIF 파일 바이너리가 나온다.
브라우저는 이걸 진짜 이미지로 렌더링함.

네, 디코딩하면 브라우저가 이미지로 렌더링된다.


✅ 3. HTML도 data URL로 삽입 가능

예 1 : base64 없이 일반 텍스트로

data:text/html,<h1>Hello</h1>
주소창에 직접 입력하면

👉 바로 <h1>Hello</h1> 제목이 렌더링됨.

공백/특수문자가 있으면 URL encoding 필요함.

예 2 : base64 사용

data:text/html;base64,PGgxPkhlbGxvPC9oMT4=

이 base64는:

<h1>Hello</h1>

브라우저는 이것도 HTML 문서처럼 렌더링함.


✅ 4. data URL 렌더링 방식 요약

MIME 타입 브라우저에서 어떻게 렌더링?
text/plain data:text/plain,Hello 그냥 텍스트 표시
text/html data:text/html,<h1>A</h1> HTML로 렌더링
text/css data:text/css,body{...} CSS로 해석
image/png data:image/png;base64,... 이미지로 렌더링
image/gif data:image/gif;base64,... GIF로 렌더링
application/json data:application/json,... JSON 표시 또는 다운로드

즉, data URL은 문서 전체·이미지 전체를 그대로 URL 안에 포함시키는 것.


🔥 핵심 요약

✔ base64는 옵션이다

data URL에서 base64는 선택적인 인코딩 방식.

✔ 하지만 이미지·바이너리는 사실상 반드시 base64

raw binary는 URL로 직접 넣을 수 없기 때문.

✔ HTML도 태그 그대로 삽입 가능

data:text/html,<html>...</html>
👉 이게 그대로 렌더링됨.

✔ 브라우저 주소창에 바로 입력해도 정상 렌더링

HTML이면 HTML로, 이미지면 이미지로.


원하면:

  • data URL의 보안 문제
  • data URL의 최대 길이 제한
  • blob URL과 data URL을 어느 상황에서 쓰는지
  • data URL → blob 변환 방법

도 더 자세하게 알려줄게!

728x90
반응형