일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 변수
- react-router-dom
- coding
- JS
- redux
- react
- 코드업
- 자바
- node
- @media
- node.js
- 반응형 페이지
- git
- CSS
- 자바문제풀이
- cleancode
- max-width
- HTML
- 코딩테스트
- 그럼에도 불구하고
- 그럼에도불구하고
- 프론트엔드
- java
- Servlet
- github
- TypeScript
- JavaScript
- media query
- frontend
- webpack
- Today
- Total
그럼에도 불구하고
[HTML] noopener noreferrer란? 본문
오늘은 noopener / noreferrer에 대해 알아보자
우선 noopenner와 noreferrer에 대해 살펴보기 전에
a 태그의 target 속성을 살펴봐야 한다.
[ target ]
a 태그의 속성 중에는 target이라는 속성이 있다.
Value | Description |
target = "_self " | 연결할 페이지의 URL 클릭 시 현재의 탭에서 연결 |
target = "_blank " | 연결할 페이지의 URL 클릭 시 새 탭에서 연결 |
즉, target은 "href 속성의 URL에 해당하는 웹 페이지를 어디에서 열 것인가?"를 지정하기 위한 속성이다.
- target = "_self "
_self의 경우 연결한 웹 페이지를 현재의 탭에서 연다.
_self는 기본 설정이므로 target 속성을 생략하더라도 같은 동작을 수행한다. (기본값)
- target = "_blank "
_blank의 경우 연결한 웹 페이지를 새로운 탭에서 연다.
[ target = "_blank "의 문제점 ]
1. 보얀상 취약점을 발생시킨다.
target = "_blank "가 사용된 링크를 사용자가 클릭하면 새 탭에서 링크된 페이지가 열린다.
이때 이 링크된 페이지가 악의를 가진 사람이 만든 것이고, 이 페이지의 Javascript에서 window.opener로
부모 윈도(링크를 건 페이지)의 object에 접근해서 "window.opener.location = 새로운 URL"로 부모 윈도의 URL을 바꾼다고 생각해 보자.
즉, 부모 윈도의 정보를 마음대로 사용하거나 조작할 수 있다는 소리다.
개인정보 유출을 유도하는 가짜 페이지로 부적절한 redirection을 하는 등의 보안상 심각한 문제가 발생할 수 있다.
2. 퍼포먼스가 떨어진다.
target = "_blank "가 사용된 링크에 의해 열린 페이지는 링크를 건 페이지와 같은 프로세스를 통해 실행된다.
그렇기에 링크된 페이지에서 높은 부하를 유발하는 Javascript가 실행되고 있으면 링크를 건 페이지에도 영향을 미쳐 의도하지 않게 퍼포먼스가 떨어질 수 있다.
이런 문제점을 해결하고자 나온 방법이 rel에 noopener와 noreferrer 속성을 지정하는 것이다.
[ rel 이란? ]
요소가 생성하는 링크의 종류를 제어하는 것으로, 현재 문서와 링크된 문서 사이의 연관 관계를 명시할 때 사용한다.
- a 태그에 href 속성이 설정되어 있어야만 사용 가능하다.
- 링크에 대해 더 많은 정보를 여러 검색 엔진들에 제공하기 위해 이 속성을 사용한다.
[ rel = "noopener" ]
noopener는 링크를 클릭하면 브라우저 콘텍스트 액세스 권한 없이 새 탭에서 링크가 열린다.
이는 새 창에서 window.opener 속성이 null 값을 반환하는 것과 같다.
더불어 링크된 페이지와 링크를 건 페이지는 별개의 프로세스로 취급되기 때문에 서로 연결되어 퍼포먼스가 떨어지는 일도 없게 된다.
즉, 신뢰할 수 없는 링크를 열 때 특히 유용하다.
[ 역할 ]
- window.opener 속성을 통한 컨트롤을 막아준다.
window.opener는 자신을 열어준 기존 창의 window 객체를 참조하여 페이지에 접근할 수 있도록 해준다. 이때 접근하는 사용자가 기존 창의 페이지에 조작을 할 수 있다는 위험이 있다.
즉, 하이퍼링크를 따라 연결되는 어떠한 브라우징 콘텍스트(browsing context)도 오프너(opener)여서는 안됨을 나타낸다.
[ 사용 방법 ]
<a href = "연결할 페이지의 URL" target = "_blank" rel ="noopener" > URL </a>
[ rel = "noreferrer" ]
HTTP 프로토콜에는 referrer라는 헤더값이 있다.
이는 이 페이지를 요청한 이전 페이지가 무엇인지를 알려주는 정보로, 링크를 이동할 때 브라우저가 웹 서버에게 전송한다.
noreferrer은 사용자가 하이퍼링크를 클릭할 때 브라우저가 HTTP referer header를 전송해서는 안됨을 나타낸다.
즉, 하이퍼링크로 이동할 때 referrer 헤더를 생략하고 참조자 정보를 누출하지 않게 막는다.
[ 사용 방법 ]
<a href = "연결할 페이지의 URL" target = "_blank" rel ="noreferrer" > URL </a>
정리하면 target="_blank"는 보안상 취약점이 발생하고 퍼포먼스가 저하되는 2가지 문제가 있다.
이 문제를 해결하기 위해서 noopenner과 noreferrer를 지정해야 한다.
웬만한 웹사이트 혹은 웹사이트 제작 플랫폼에서는 target = "_blank"를 사용하면
자동으로 rel = "noopenner noreferrer"가 붙는다고 한다.
그만큼 필수 요소라는 증거이다.
target = "_blank"를 사용할 때는
<a href = "연결할 페이지의 URL" target = "_blank" rel ="noopener noreferrer" > URL </a>
위의 코드처럼 rel ="noopener noreferrer"를 생활화하자.
'HTML, CSS > HTML, CSS basics' 카테고리의 다른 글
[CSS] 텍스트 세로로 표시하기 (0) | 2023.01.17 |
---|---|
[CSS] 벤더 프리픽스란? (0) | 2022.12.23 |
[HTML] display 프로퍼티 / block / inline / inline - block 레벨 요소 (0) | 2022.12.20 |
[CSS] 프로퍼티 값의 단위 (0) | 2022.12.20 |
[CSS] Viewport 단위 (vh,vw,vmin,vmax) (0) | 2022.12.20 |