이건 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
따라서:
✔ 프로토콜/스킴
✔ 스킴 구분자
✔ 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
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 URL이 OS마다 어떻게 다르게 해석되는지 (윈도우/리눅스/맥)
도 설명해줄게!
✅ 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 이 아니다
✔ origin 은 blob 을 만든 페이지의 출처 표시용
원하면:
- 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을 열면 브라우저는:
- 내부 Map 같은 구조에서
→ 키 "12345" 에 해당하는 Blob/Data 객체를 찾고 - 그 객체를 브라우저에서 렌더링하거나 다운로드하게 만듦
즉,
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 변환 방법
도 더 자세하게 알려줄게!
'네트워크2' 카테고리의 다른 글
| 403 에러 & Referrer vs Origin 차이점 (0) | 2025.11.17 |
|---|---|
| navigator.userAgnet = User-Agent 헤더(Request Headers) (0) | 2025.11.17 |
| HTTP/1.1 프로토콜 버전 http/1.1, h2, h3 ... (0) | 2025.11.15 |
| TCP/IP 4계층 모델 (0) | 2025.11.15 |
| OSI 7계층 (네트워크 통신을 7단계로 나눈 모델) (0) | 2025.10.24 |
| 차단 우회 방법 (0) | 2025.10.08 |
| 유니콘 HTTPS :: HTTPS 암호화 통신 :: DPI 차단 우회 기능 (0) | 2025.10.08 |
| Cloudflare 란? :: CDN/프록시 서버 & 원 서버 (0) | 2025.10.08 |