티스토리 뷰

발생일: 2010.12.03


문제:
외부 코드와 연동 작업을 하다가 아래와 같은 스크립트 오류가 발생했다.

Permission denied
Location.toString

오류가 발생하는 원인이 무엇이고, 해결할 수 있는 방법은 무엇일까?


해결책:

Permission denied 나 Location.toString 문구가 포함된 오류는
1) 다른 도메인으로 Ajax 요청을 보내려고 시도하거나,
2) 도메인이 서로 다른 프레임에서 스크립트로 접근을 시도하는 경우
에 발생한다.


이는 브라우저의 동일 근원 정책(Same origin policy)를 위배했기 때문이다.
브라우저는 아래의 경우에만 접근을 허용한다.
1) 같은 프로토콜. 
2) 같은 포트.
3) 같은 호스트(도메인 포함).


예를 들어, 아래의 경우는 접근이 허용되지 않으며 Permission denied 오류를 발생한다.
http://ohgyun.com 과 https://ohgyun.com 간의 접근 (다른 프로토콜)
- ohgyun.com:80 과 ohgyun.com:8080 간의 접근 (다른 포트)
one.ohgyun.com 과 two.ohgyun.com 간의 접근 (다른 호스트)
- ohgyun.com 과 one.ohgyun.com 간의 접근 (다른 호스트)


작업 중 오류가 발생했던 이유는,
iframe 에 포함된 서브 도메인 영역의 페이지에서 다른 프레임으로 스크립트 접근을 시도했기 때문이다.


예를 들어, 메인 페이지 ohgyun.com 에 광고를 달기 위해
광고가 포함된 페이지 ad.ohgyun.com 을 iframe 으로 추가한다고 가정해보자.

만약 광고가 포함된 프레임에서 상위 프레임(parent)에 접근하려고 할 경우, 
호스트가 다른 소스이기 때문에 권한 오류가 발생하게 된다.


이 문제를 해결하기 위해서 각 페이지의 document.domain 값을 동일하게 맞춰주면 된다.

DOM HTML 스펙에 의하면 document.domain 값을 읽기 전용이지만,
현재 도메인의 최상위 도메인으로 설정하는 것은 예외로 허용된다.
예를 들어,
- one.ohgyun.com 페이지에서 document.domain = "ohgyun.com" 으로 설정하는 것은 허용되지만,
- one.ohgyun.com 페이지에서 document.domain = "two.ohgyun.com" 으로의 설정은 허용되지 않는다.


따라서, 서브 도메인 간 Ajax 나 iframe 접근이 필요할 경우, 스크립트 상단에 document.domain 을 동일하게 유지시켜주면 되겠다.



#. 덧 (실습)
네이버나 다음의 메인 페이지에도 도메인이 다른(호스트가 다른) 광고 페이지가 iframe 으로 추가되어 있다.
a) 메인 페이지의 소스에서 document.domain 을 찾아보고,
b) 광고가 포함된 iframe 페이지의 소스에서 document.domain 이 동일하게 설정되어 있는지 찾아보자.



#. 참고자료
- 동일 근원 정책(Same origin policy)
반응형
댓글
공지사항