우리가 사용하는 <a> 태그에는 rel 속성이 있고 요즘 웹 페이지에서는 noreferrer, noopener, nofollow 등이 자주 보인다. 보안과 관련해 3가지 속성에 대해서 정리해보자.

a태그 rel 속성

<a> 태그의 rel 속성은 현재 문서와 링크된 문서 사이의 연관 관계를 명시할 때 사용한다. 이 속성은 반드시 href 속성이 설정되어 있어야만 사용 가능하다.

noopener

target="_blank" 속성 값을 noopener 속성을 사용하지 않고 사용한다면 <a>태그로 링크된 페이지를 열었을경우 연결 페이지에 window.opener 객체가 존재하는 것을 확인할 수 있다. 이렇게 열린 페이지는 자신을 연 브라우저에 대한 정보를 가지고, 제어할 수 있는 권한이 생긴다.
악의적으로 접근해 이를 이용한 피싱 공격을 탭 내빙(Tab nabbing)이라고 한다.

noopener를 적용하면 원본 페이지에 대한 컨텍스트 엑세스를 제공하지 않고 새 탭에서 최상위 브라우징 컨텍스트를 새로 생성하여 링크를 열도록 브라우저에게 지시한다. 따라서 새 페이지에서의 window.opener의 값은 null이 된다.


noreferrer

noopener 와 유사한 기능으로 noreferrer는 새로 열린 사이트가 window.opener 객체를 조작하지 못하게 한다.

noopener 와 noreferrer는 언제 사용할까?

일반적으로 둘 다 사용하는것이 좋다. 브라우저 호환성 때문이고, IE가 문제다. 대부분의 최신 브라우저는 두 속성 모두를 지원한다. 하지만 일부 구형 브라우저의 경우에는 noopener만 지원하기 때문에 일반적으로는 둘 다 사용하도록 하자.


nofollow

nofollow 속성값은 검색 엔진에게 광고성 링크, 댓글등 또는 웹사이트와 연결하지 않기를 바라거나 크롤링하지 않기를 바라는경우 사용한다.

nofollow 스팸 댓글 때문에 등장했다. 페이지에 부분별하게 달린 스팸 댓글이 페이지 순위에 영향을 주고, 평판이 내려간다. 따라서 구글은 nofollow 속성이 있는 링크는 크롤링 하지 않고 검색 엔진에도 영향을 미치지 않게 로직을 변경했다. 하지만 nofollow 속성이 적용되었다해도 해당 페이지의 크롤링을 완전히 막을수는 없다. nofollow에 의존하기 보다 robots.txt 또는 메타 태그를 이용하는 것이 가장 좋은 방법이다.

profile
프론트엔드 개발자가 되겠습니다🔥

1개의 댓글

comment-user-thumbnail
2023년 3월 31일

안녕하세요, 제로베이스 프론트엔드스쿨 멘토입니다. 작성해주신 글 잘 읽었고, 앞으로의 더 나은 블로깅을 응원하는 마음에서 작은 의견을 남기고 갑니다 :)

  • noreferrer에 대한 설명이 조금 더 들어가면 좋을 것 같습니다. noreferrer는 oopener의 기능(작성해주신 window.opener로 부모 컨텍스트를 참조할 수 없게 되는 것)에 더해서 추가적으로, referrer 헤더를 생략하게 되는데요, 이 때문에 통계 분석 도구에서 유입의 출처를 알 수 없으므로, 통계 분석 도구상의 수치가 왜곡될 수 있다는 점이 있습니다. 간략하게 설명을 드렸는데요, 학습해보시고 내용 추가해주시면 좋을 것 같습니다.. 현재 작성해주신 내용을 봤을 때 제가 면접관이라면, 'noopener와 noreferrer의 차이점은 무엇인가요?'라고 질문을 드릴 것 같아 말씀 드렸습니다 :)
  • nofellow가 등장한 배경에 대해 설명해주셨는데 다소 모호한 부분(의미상 반대로 작성된 부분)이 있는 것 같아 명확하게 해주면 좋을 것 같습니다. '페이지에 무분별하게 달린 스팸 댓글이 페이지 순위에 영향을 주고, 평판이 내려간다'라고 작성해주셨는데, 페이지에 무문별하게 달린 스팸 댓글은 클릭을 유도하므로, 검색 엔진상의 평판이 올라가게 됩니다. 이러한 어뷰징으로 검색 엔진에서의 평판이 좋아지면 안되므로, nofollow가 등장했다고 볼 수 있습니다.
  • 참고하신 링크가 있다면, 하단에 참고 링크를 적어서, 외부의 자료에서 가져온 내용과 내가 주도적으로 학습하고 정리한 내용이 드러날 수 있도록 하면 좋을 것 같습니다.

감사합니다!

답글 달기