CORS 제대로 이해하고 해결하기: SOP, 프리플라이트, 인증 요청

개요 브라우저에서 API 호출이 분명 성공한 것 같은데, 콘솔에는 CORS 에러가 뜨는 상황 자주 마주함 문제의 본질은 서버가 망가진 게 아니라 브라우저의 보안 정책에 의해 응답 사용이 차단된 것임 CORS는 차단을 풀기 위한 협상 절차이자 규칙 세트이며, 정확히 이해하면 재현과 해결이 쉬워짐 핵심 개념 Origin 정의 Origin = scheme + host + port 조합 세 요소 중 하나라도 다르면 서로 다른 출처로 판단 SOP(Same-Origin Policy) 동일 출처 간 상호작용 허용, 교차 출처는 기본 차단하는 브라우저 보안 정책 XSS, CSRF 등 교차 사이트 공격 리스크 완화 목적 출처 비교와 차단 판단 주체는 서버가 아니라 브라우저 예외적으로 허용되는 리소스 ...

March 18, 2026

Reverse Tabnabbing과 target=_blank 안전 가이드

개념/배경 Reverse Tabnabbing은 target="_blank"로 연 새 탭이 window.opener를 통해 기존 탭을 피싱 페이지로 바꾸는 기법을 말함 새 탭이 기존 탭에 대한 참조를 갖기 때문에 발생하며, 자바스크립트로 opener의 위치를 변경 가능함 예시 window.opener.location = 'https://cgn.example.com' 이 참조를 끊는 표준 방법은 링크에 rel=“noopener” 또는 rel=“noopener noreferrer"를 명시하는 것임 공격 시나리오 사용자가 cgm.example.com 접속 happy.example.com 링크 클릭 새 탭에서 happy.example.com 열림 → 스크립트가 기존 탭을 피싱 사이트로 이동시킴 window.opener.location='https://cgn.example.com' 기존 탭으로 돌아온 사용자는 세션 만료로 오인 후 자격증명 입력 피싱 페이지가 정보를 수집 후 원래 페이지로 리다이렉션 방어 전략 앵커 태그에 rel=“noopener” 최소 적용, 가능하면 rel=“noopener noreferrer” 적용 권장 noopener: 새 탭에서 window.opener가 null이 되어 기존 탭 제어 불가 noreferrer: 대부분 브라우저에서 opener 차단 + Referer 헤더 전송 차단 자바스크립트로 새 창을 열 경우 window.open(url, '_blank', 'noopener') 사용 고려 기존 코드 점검 시 target="_blank” 링크에 rel 값 누락 여부 정적 분석 또는 린트 규칙으로 검출 권장 주의 사항 일부 최신 브라우저는 target="_blank"에 대해 기본적으로 noopener를 적용하는 경향 있으나 브라우저·버전별 차이 존재, 명시적 rel 사용이 안전 noreferrer는 분석 도구에서 유입 경로 확인이 어려워질 수 있음, 트래픽 분석 요구가 있으면 noopener만 선택하는 운영 전략 고려 참고: noopener와 noreferrer noopener: 새 탭의 Window.opener를 제거하여 원탭 조작 방지 noreferrer: Referer 헤더 차단, 대부분 환경에서 opener 제거 동작 동반 마무리 target="_blank"는 편리하지만 기본 동작만으로는 탭 간 참조가 남아 공격면 존재 모든 외부 링크에 rel=“noopener” 또는 필요에 따라 rel=“noopener noreferrer"를 일관 적용하는 것이 가장 단순하고 효과적인 방어 전략임 ...

March 15, 2026