HTML <link>: 외부 리소스 링크 요소
HTML <link>
요소는 현재 문서와 외부 리소스의 관계를 명시합니다. <link>
는 스타일 시트를 연결할 때 제일 많이 사용하지만, 사이트 아이콘 (“파비콘”과 홈 화면 아이콘) 이미지 연결 등 다른 여러가지 용도로도 사용할 수 있습니다.
외부 스타일 시트를 연결하려면 <link>
요소를 <head>
안에 배치하세요.
<head>
<link href="main.css" rel="stylesheet" />
</head>
위의 코드는 href
특성에 연결하려는 스타일 시트의 경로를 지정하고, rel
특성에 stylesheet
을 사용하는 짧은 예제입니다. rel
은 현재 문서와 연결한 아이템의 관계(relationship)가 어떻게 되는지 설명하는, <link>
의 제일 중요한 기능 중 하나라고 볼 수 있습니다. 지정할 수 있는 관계에는 다양한 종류가 있고, 전체 목록은 링크 유형 참고서에서 볼 수 있습니다.
일부 관계 유형은 특히 더 자주 쓰입니다. 예를 들어, 사이트에 파비콘을 추가하려면…
<link rel="icon" href="favicon.ico" />
아이콘 추가에 사용하는 rel
에는 다른 값도 있으며, 주로 다양한 휴대기기 플랫폼에서 사용하는 특별한 아이콘을 지정할 때 사용합니다.
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-icon-114.png" type="image/png" />
sizes
특성은 아이콘 크기를 나타내고, type
특성은 연결할 리소스의 MIME 유형입니다. 브라우저는 이런 추가 정보를 바탕으로 현재 가장 적합한 아이콘을 선택합니다.
media
특성에 미디어 유형이나 쿼리를 지정할 수도 있는데, 그러면 해당 미디어 조건을 만족할 때만 연결된 리소스를 불러옵니다.
<link href="print.css" rel="stylesheet" media="print" />
<link href="mobile.css" rel="stylesheet" media="screen and (max-width: 600px)" />
최근에는 <link>
에 성능 및 보안 관련 기능도 추가됐습니다. 다음 코드로 살펴보겠습니다.
<link rel="preload" href="myFont.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
rel
의 preload
값은 브라우저가 이 리소스를 미리 불러와야 한다는 것을 나타내고, as
특성은 가져오려는 리소스가 어떤 리소스인지 나타냅니다. 마지막으로 crossorigin
특성은 리소스를 CORS 요청으로 불러와야 하는지 결정합니다.
기타 특징도 확인하세요.
- 링크 관계의 유형이 “body-ok”라면
<link>
를<body>
안에 배치할 수도 있습니다. 예를 들어stylesheet
링크 유형은 body-ok며, 따라서<link rel="stylesheet">
은<body>
내에 배치할 수 있습니다. 그러나 가능한 방법이 좋은 방법은 아닙니다.<link>
는 콘텐츠와 분리해<head>
에 배치하는 편이 낫습니다. <link>
를 사용해 파비콘을 추가할 때, 사이트가 보안 향상을 위해 콘텐츠 보안 정책(CSP)을 적용하고 있으면 파비콘도 CSP의 대상이 됩니다. 파비콘을 불러올 수 없으면Content-Security-Policy
헤더의img-src
지시어가 접근을 막고 있나 확인해보세요.
특성
전역 특성을 포함합니다.
as
rel="preload"
또는rel="prefetch"
를 지정한 경우에만 사용합니다.<link>
가 불러오는 콘텐츠의 유형을 나타낼 수 있으며, 요청 매칭과 올바른 콘텐츠 보안 정책 적용, 올바른Accept
요청 헤더 설정에 필요합니다. 또한rel="preload"
특성은as
특성의 값을 요청 우선순위 결정에 참고합니다. 아래는as
의 값과, 대응하는 요소 또는 리소스를 나열한 표입니다.값 적용 대상 audio
<audio>
요소document
<iframe>
,<frame>
요소embed
<embed>
요소fetch
fetch
,XMLHttpRequest
.
참고: 이 값을 사용하려면<link>
에crossorigin
특성도 지정해야 합니다.font
CSS @font-face
image
<img>
,srcset
또는imageset
을 지정한<picture>
, SVG<image>
, CSS*-image
속성object
<object>
요소script
<script>
요소, Web WorkerimportScripts
style
<link rel="stylesheet">
요소, CSS@import
track
<track>
요소video
<video>
요소worker
Worker
,SharedWorker
crossorigin
지정한 리소스를 가져올 때 CORS를 사용해야 하는지 나타내는 열거형 특성입니다. CORS 활성화 리소스는
<canvas>
요소에 사용해도 캔버스가 오염(taint)되지 않습니다. 가능한 값은 다음과 같습니다.anonymous
자격 증명 없이 교차 출처 요청을 전송합니다. 즉,
Origin
헤더를 포함해 요청하지만 쿠키, X.509 인증서, HTTP Basic 인증은 전송하지 않습니다. 서버에서Access-Control-Allow-Origin
헤더를 설정하지 않아 요청 출처가 인증 정보를 받지 못하면 리소스는 오염되고, 사용처가 제한됩니다.user-credentials
자격 증명과 함께 교차 출처 요청을 전송합니다. 즉,
Origin
헤더를 쿠키, X.509 인증서, 또는 HTTP Basic 인증과 함께 전송합니다. 서버에서Access-Control-Allow-Origin
헤더를 설정하지 않아 요청 출처가 인증 정보를 받지 못하면 리소스는 오염되고, 사용처가 제한됩니다.
이 특성이 존재하지 않으면 리소스를 CORS 요청 없이 (
Origin
HTTP 헤더 없이) 가져오므로 리소스가 오염됩니다. 유효하지 않은 값의 경우anonymous
깂을 사용한 것으로 간주합니다.disabled
rel="stylesheet"
전용 불리언 특성입니다. 스타일 시트를 불러온 후에 문서에 적용해야 하는지 지정합니다. HTML을 불러온 시점에disabled
가 지정되어 있는 경우 스타일 시트를 아예 불러오지 않고, 값이false
로 바뀌거나 아예 특성이 제거되는 시점에 불러옵니다.DOM에서
disabled
특성을 지정하면 문서의styleSheets
리스트에서 스타일 시트가 제거됩니다.fetchpriority
리소스를 가져올 때의 우선순위에 대한 힌트를 브라우저에 제공합니다. 가능한 값은 다음과 같습니다.
high
다른 리소스에 비해 높은 우선순위로 가져와야 함을 표시합니다.
low
다른 리소스에 비해 낮은 우선순위로 가져와야 함을 표시합니다.
auto
기본 값입니다. 브라우저가 우선순위를 자동으로 판단합니다.
href
연결할 리소스의 URL입니다. 절대 URL과 상대 URL 모두 지정할 수 있습니다.
hreflang
href
로 연결한 링크의 인간 언어를 지정합니다. 별도의 기능은 없습니다. 전역lang
특성과 같은 값을 사용합니다.imagesize
as="image" rel="preload"
전용 특성입니다. Sizes 특성으로,<img>
요소에 사용할 이미지 리소스를 미리 불러올 때 그sizes
특성으로 이 값을 사용합니다.imagesrcset
as="image" rel="preload"
전용 특성입니다. Srcset 특성으로,<img>
요소에 사용할 이미지 리소스를 미리 불러올 때 그srcset
특성으로 이 값을 사용합니다.integrity
가져올 리소스의 해시 값을 Base64로 인코딩해 지정하면, 주어진 해시와 실제로 가져온 리소스의 해시를 브라우저가 비교해서 변형이나 조작이 있었는지 판별합니다. 하위 리소스 무결성 문서를 참고하세요.
media
가져온 리소스를 적용할 매체를 지정합니다. 매체 유형이나 미디어 쿼리 문자열을 지정할 수 있습니다. 매체에 따라서 스타일 시트를 다르게 적용할 때 유용합니다.
prefetch
다음 탐색 발생 시 이 리소스가 필요할 수도 있으므로 사용자 에이전트가 미리 불러오도록 지정합니다. 실제로 리소스가 필요해지면 새로 불러올 필요가 없으므로 응답 속도가 더 빨라질 수 있습니다.
referrerpolicy
리소스를 가져올 때 사용할 리퍼러를 지정합니다. 다음 값을 사용해야 합니다.
no-referrer
:Referer
헤더를 전송하지 않습니다.no-referrer-when-downgrade
: TLS(HTTPS) 지원을 하지 않는 출처에 대해서는Referer
헤더를 전송하지 않습니다.origin
:Referer
헤더가 요청의 출처, 즉 스킴, 호스트, 포트를 포함합니다.origin-when-cross-origin
: 다른 출처로 요청할 땐 리퍼러 데이터를 스킴, 호스트, 포트로 제한합니다. 동일 출처로 요청할 땐 전체 경로도 포함합니다.same-origin
: 동일 출처 요청에는 리퍼러를 전송하고, 교차 출처 요청에는 전송하지 않습니다.strict-origin
: 보안 수준이 동일(HTTPS→HTTPS)할 땐 문서의 출처를 리퍼러로 전송하고, 더 낮을(HTTPS→HTTP) 땐 전송하지 않습니다.strict-origin-when-cross-origin
(기본 값): 동일 출처 요청에는 전체 URL을 전송합니다. 교차 출처 요청에 대해서는 보안 수준이 동일(HTTPS→HTTPS)할 땐 문서의 출처를 리퍼러로 전송하고, 더 낮을(HTTPS→HTTP) 땐 전송하지 않습니다.unsafe-url
: 리퍼러가 항상 출처, 경로, 쿼리 문자열을 포함합니다. 프래그먼트, 비밀번호, 사용자 이름은 포함하지 않습니다. 안전하지 않은 값입니다. TLS로 보호받는리소스에서 보호 없는 출처로 정보가 누출될 수 있습니다.
rel
연결하는 리소스와 현재 문서 사이의 관계를 명시합니다. 공백으로 구분한 링크 유형 값의 목록이어야 합니다.
sizes
리소스가 담고 있는 아이콘의 크기를 지정합니다.
rel
의 값이icon
이거나, 비표준 아이콘 값인apple-touch-icon
등일 때만 지정해야 합니다. 가능한 값은 다음과 같습니다.-
any
:image/svg+xml
등 벡터 형식 아이콘이라서 어떠한 크기라도 될 수 있음을 나타냅니다. -
<너비 픽셀>x<높이 픽셀>
또는<너비 픽셀>X<높이 픽셀>
의 형식으로 나타내는 아이콘 크기입니다. 공백으로 구분한 리스트로, 복수의 값을 지정할 수 있습니다. 단, 복수의 값을 지정하는 경우 해당 아이콘 리소스가 모든 크기를 포함하고 있어야 합니다.
대부분의 아이콘 파일 형식은 단일 크기의 이미지만 저장할 수 있으므로 대부분의
sizes
특성 역시 하나의 값만 갖게 됩니다. Microsoft의 ICO 파일 형식이 다양한 크기를 지원하는 이미지 형식의 예시입니다.-
title
<link>
요소의title
특성은 전역title
특성과 다른 의미를 갖습니다.<link>
의title
을rel="stylesheet"
와 함께 사용하면 선호 스타일 시트와 대체 스타일 시트를 지정할 수 있습니다.
예제
스타일 시트 연결
<link href="style.css" rel="stylesheet" />
다양한 맥락에서 사용할 아이콘 제공하기
한 페이지가 서로 다른 아이콘 여러 개와 연결되면, 브라우저는 rel
과 sizes
값을 참고해서 최적의 아이콘을 선택합니다.
<!-- Retina 디스플레이 iPad -->
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="favicon144.png" />
<!-- Retina 디스플레이 iPhone -->
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="favicon114.png" />
<!-- 구형 iPad -->
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="favicon72.png" />
<!-- 구형 iPhone -->
<link rel="apple-touch-icon-precomposed" href="favicon57.png" />
<!-- 기본 아이콘 -->
<link rel="icon" href="favicon32.png" />
미디어 쿼리에 맞는 스타일 시트만 불러오기
요소의 media
특성에 매체 유형이나 미디어 쿼리를 지정하면 현재 매체가 조건을 만족할 때만 리소스를 가져오게 됩니다.
<link href="print.css" rel="stylesheet" media="print" />
<link href="mobile.css" rel="stylesheet" media="all" />
<link href="desktop.css" rel="stylesheet" media="screen and (min-width: 600px)" />
<link href="highres.css" rel="stylesheet" media="screen and (min-resolution: 300dpi)" />
스타일 시트 load
이벤트
<link>
요소에서 발생하는 load
이벤트를 통해 스타일 시트를 불러온 시점을 알아낼 수 있습니다. 마찬가지로, 스타일 시트를 불러오다가 오류가 발생하면 error
이벤트를 통해 감지할 수 있습니다.
<script>
const stylesheet = document.querySelector('#stylesheet')
myStylesheet.onload = function () {
console.log('스타일 시트를 불러왔습니다.')
}
myStylesheet.onerror = function () {
console.error('스타일 시트를 불러오지 못했습니다!')
}
</script>
<link rel="stylesheet" href="stylesheet.css" id="stylesheet" />
load
이벤트는 정확히 해당 스타일 시트 본문과 그 스타일 시트에서 가져오는 다른 콘텐츠까지 모두 불러와서 분석을 마친 후, 콘텐츠에 적용하기 직전에 발생합니다.
명세
브라우저 호환성
데스크톱 | 모바일 | ||||||
---|---|---|---|---|---|---|---|
iOS | Android | ||||||
Safari | Chrome | Firefox | Safari | Chrome | Firefox | Samsung Internet | |
link | |||||||
as | |||||||
blocking | |||||||
charset | |||||||
crossorigin | |||||||
disabled | |||||||
fetchpriority | |||||||
href | |||||||
hreflang |