제이슨프
JSONPJSONP 또는 JSON-P(패딩 포함 JSON)는 로딩하여 데이터를 요청하기 위한 과거 자바스크립트 기법이다.<script>일반 자바스크립트를 로드하기 위한 요소.[1]2005년 밥 이폴리토에 의해 제안되었다.[2]JSONP는 JavaScript 코드를 실행하여 페이지의 원본 사이트 외부에서 가져온 미디어 DOM 요소 또는 XMLHtpRequest 데이터를 읽을 수 없도록 하는 동일한 원본 정책을 우회하는 데이터 공유를 가능하게 한다.원래 사이트는 URI 구성표, 호스트 이름 및 포트 번호의 조합으로 표시된다.
JSONP는 무해함수 호출을 악성코드로 대체하는 데이터 소스에 취약하기 때문에 현대 애플리케이션에서 크로스 오리진 자원 공유(2009년[3] 이후 이용 가능)로 대체되고 있다.
기능
HTML<script>원소는 일반적으로 외국 기원에서 검색된 자바스크립트 코드를 실행할 수 있다.그러나 순수한 JSON 데이터로 응답하는 서비스들은 CORS(Cross-Origin 자원 공유)를 채택하기 전에는 외국 기원의 데이터를 공유할 수 없었다.
예를 들어, 해외 서비스에 대한 요청http://server.example.com/Users/1234JSON 형식의 앨리스라는 사람에 대한 레코드를 반환할 수 있다.JSON 구문은 JavaScript의 객체 구문과 일치한다.
{ "이름": "앨리스", "아이드": 1234, "계급": 7 } CORS를 지원하지 않는 경우 도메인 간에 데이터를 사용하려고 하면 JavaScript 오류가 발생한다.
<각본을 뜨다 타자를 치다="응용프로그램/응용프로그램" src="http://server.example.com/Users/1234"> </각본을 뜨다> 브라우저에서 다운로드되는<script>파일을 작성하고, 내용을 평가하고, 원시 JSON 데이터를 블록으로 잘못 해석하고, 구문 오류를 발생시킨다.데이터를 자바스크립트 개체 리터럴로 해석해도 브라우저에서 실행되는 자바스크립트에 의해 액세스할 수 없었으며, 가변 할당 없이는 개체 리터럴에 액세스할 수 없기 때문이다.
JSONP 사용 패턴에서 URL 요청은 다음을 가리켰다.src에 속하다<script>요소는 JavaScript 코드(일반적으로 함수 호출)를 감싼 채 JSON 데이터를 반환한다.이 "포장된 페이로드"는 브라우저에 의해 해석된다.이런 식으로, 자바스크립트 환경에 이미 정의된 함수는 JSON 데이터를 조작할 수 있다.대표적인 JSONP의 요청과 대응은 아래와 같다.
parseResponse() 함수 호출은 JSONP의 "P" 즉, 순수한 JSON 주위의 "패딩" 또는 "프리픽스"이다.[4]JSONP가 작동하려면, 서버는 JSONP 기능을 포함하는 응답으로 회신해야 한다.JSONP는 JSON 형식 결과와 함께 작동하지 않는다.다시 전송되는 JSONP 함수 호출과 함수가 수신하는 페이로드에는 클라이언트와 서버가 동의해야 한다.관례에 따라, JSON 데이터를 제공하는 서버는 JSONP 기능의 이름을 지정하기 위해 요청 웹사이트를 제공하며, 일반적으로 이름 jsonp 또는 콜백은 서버에 대한 요청에서 명명된 쿼리 문자열 매개변수로 사용한다.<script src="http://server.example.com/Users/1234?callback=parseResponse"></script>.
이 예에서 수신된 페이로드의 예는 다음과 같다.
parseResponse({"이름": "앨리스", "아이드": 1234, "계급": 7}); 스크립트 요소 주입
JSONP는 스크립트 요소와 함께 사용할 때만 의미가 있다.각각의 새로운 JSONP 요청에 대해, 브라우저는 새로운 것을 추가해야 한다.<script>요소 또는 기존 요소를 재사용하십시오.이전 옵션(새 스크립트 요소 추가)은 동적 DOM 조작을 통해 수행되며 스크립트 요소 주입으로 알려져 있다.그<script>요소는 HTML DOM에 주입되며, 원하는 JSONP 엔드포인트의 URL은 "src" 속성으로 설정된다.이 동적 스크립트 요소 주입은 일반적으로 JavaScript 도우미 라이브러리에 의해 수행된다. jQuery와 다른 프레임워크는 JSONP 도우미 기능을 가지고 있다. 또한 독립 실행형 옵션도 있다.
JSONP 호출에 대해 jQuery를 사용하여 스크립트 요소를 동적으로 주입하는 예는 다음과 같다.
$.getscript("http://server.example.com/Users/192.168.73.96?callback=parseResponse"); 요소가 주입된 후 브라우저는 요소를 평가하고 src URL에서 HTTP GET를 수행하여 내용을 검색한다.그런 다음 브라우저는 반환 페이로드를 JavaScript로 평가한다.이것은 일반적으로 함수 호출이다.그런 식으로 JSONP를 사용하면 브라우저 페이지가 스크립트 요소 주입을 통해 동일한 오리진 정책을 중심으로 작동할 수 있다.[5]
스크립트는 포함 페이지의 범위 내에서 실행되며, 따라서 여전히 포함 페이지의 도메인과 관련된 교차 도메인 제한의 대상이 된다.이는 예를 들어 웹 페이지가 JSONP를 통해 다른 사이트에 호스팅된 라이브러리를 로드한 다음 해당 사이트에 XMLHtpRequest를 요청할 수 없다는 것을 의미한다(CORS(Cross-Origin Resource Sharing)가 지원되지 않는 한), 이러한 라이브러리를 사용하여 자신의 사이트에 XMLHtpRequest를 만들 수 있다.
보안 문제
신뢰할 수 없는 타사 코드
원격 서버의 스크립트 요소를 포함하면 원격 서버가 웹 사이트에 콘텐츠를 주입할 수 있다.원격 서버에 JavaScript 주입을 허용하는 취약성이 있는 경우, 원본 서버에서 제공된 페이지는 증가된 위험에 노출된다.공격자가 JavaScript를 원래 웹 페이지에 주입할 수 있는 경우, 그 코드는 동일한 원본 정책을 무시하고 모든 도메인에서 추가 JavaScript를 검색할 수 있다.[6]Content Security Policy HTTP Header는 웹 사이트가 웹 브라우저에 어떤 도메인 스크립트가 포함될 수 있는지 알려줄 수 있도록 한다.
2011년경에는 브라우저가 "응용프로그램/json-p"와 같은 특정 MIME 유형의 스크립트 요청에 적용할 수 있는 JSONP에[1] 대한 보다 안전한 하위 집합 정의를 정의하기 위한 노력이 수행되었다.응답이 엄격한 JSONP로 구문 분석되지 않으면 브라우저가 오류를 발생시키거나 전체 응답을 무시할 수 있다.그러나, 이러한 접근방식은 코르스에 유리하게 포기되었고, JSONP에 대한 올바른 MIME 타입은 남아있다.application/javascript.[7]
공백 차이
JSONP는 JSON을 해결하는 것과 동일한 문제를 안고 있다.eval(): 둘 다 JSON 텍스트를 JSON 본래의 U+2028(라인 구분자)과 U+2029(문단 구분자) 처리에서의 차이를 의미하는 JavaScript로 해석한다.이로 인해 JSONP에서는 일부 JSON 문자열이 불법이 되고, JSONP를 서비스하는 서버는 전송 전에 이러한 문자에서 벗어나야 한다.[8]
콜백 이름 조작 및 반영 파일 다운로드 공격
인증되지 않은 콜백 이름을 사용하여 클라이언트에 악의적인 데이터를 전달하고 관련 제한 사항을 우회할 수 있음application/json2014년 RFD(반영된 파일 다운로드) 공격에서 입증된 내용 유형.[9]
불안정한 JSONP 엔드포인트에도 악성 데이터가 주입될 수 있다.[10]
사이트 간 요청 위조
JSONP의 순진한 배치는 교차 사이트 요청 위조(CSRF 또는 XSRF) 공격을 받는다.[11]왜냐하면 HTML이<script>요소는 웹 브라우저 구현에서 동일한 원본 정책을 준수하지 않으며, 악의적인 페이지는 다른 사이트에 속하는 JSON 데이터를 요청하고 얻을 수 있다.이를 통해 JSON 인코딩 데이터를 악의적인 페이지의 컨텍스트에서 평가할 수 있어 사용자가 현재 다른 사이트에 로그인한 경우 암호나 기타 중요한 데이터를 누설할 수 있다.
로제타 플래시
Rosetta Flash는 공격자가 취약한 JSONP 끝점이 있는 서버를 공격자가 이용할 수 있도록 하는 공격 기법으로, Adobe Flash Player가 공격자 지정 Flash Applet이 취약한 서버에서 시작되었다고 믿도록 한다.Flash Player는 (쿠키로) 요청을 하고 호스팅 사이트에서 응답을 받을 수 있도록 하는 동일한 오리진 정책을 구현한다.그런 다음 애플릿은 검색된 데이터를 공격자에게 다시 보낼 수 있다.이것은 취약한 도메인에 임의의 플래시 애플릿을 내장하는 것과 유사한 영향을 미치는 교차 오리진 공격이다.이 취약성은 특정 헤더가 있는 zlib 스트림과 ad-hoc Huffman 코딩이 있는 DEFLATE 블록을 조작하여 영숫자 문자로 완전히 구성된 SWF 파일로 컴파일된 ActionScript 페이로드(AdctionScript payload)를 사용한다.그 결과 영숫자 전용 SWF 파일은 JSONP 호출의 콜백 파라미터로 사용된다.구글, 유튜브, 트위터, 야후!, 얀덱스, 링크드인, 이베이, 인스타그램, 텀블러 등 유명 사이트들은 모두 2014년 7월까지 취약했다.[12]이 취약성은 구글 보안 엔지니어 미슐레 스파그누올로[13](Michelle Spagnuolo)에 의해 발견되어 출판되었으며 CVE-를 가지고 있다.2014-4671[14] 및 CVE-2014-5333.[15]2014년 7월 8일 발매된 Adobe Flash Player 릴리즈 버전 14.0.0.145에서는 플래시 파일의 검증 강화가 도입되었고,[16] 2014년 8월 12일에 발매된 버전 14.0.0.176에서는 픽스를 확정하여 이러한 악용 행위가 작동하지 않게 하였다.[17]
역사
2005년 7월, 조지 제레미는 JSON에 앞서 선택적 변수 할당을 제안했다.[18][19]패딩이 콜백 기능인 JSONP에 대한 원래 제안은 밥 이폴리토가[20] 2005년 12월에 한 것으로 보이며 현재는 도조 툴킷, 구글 웹 툴킷, 웹 서비스 등 많은 웹 2.0 어플리케이션에서 사용되고 있다.
참고 항목
참조
- ^ a b "Safer cross-domain Ajax with JSON-P/JSONP". JSON-P.org. Archived from the original on March 4, 2016. Retrieved 2011-10-30.
- ^ Ippolito, Bob (December 5, 2005). "Remote JSON - JSONP". Bob Ippolito on Haskell, Python, Erlang, JavaScript, etc. Archived from the original on 2012-06-08. Retrieved 2017-02-10.
- ^ "Cross-Origin Resource Sharing". Can I use... Retrieved 4 May 2020.
- ^ "Experimental RDF result set to JSON translator". Archived from the original on November 15, 2014. Retrieved February 20, 2012.
- ^ "So how does JSONP really work? Some simple examples". Jason Schock. 2013-02-05. Retrieved 2021-12-26.
- ^ Ben Hayak (2014-10-17). "Same Origin Method Execution" (PDF). Retrieved 2014-10-22.
- ^ Grey, Eli (2010-06-27). "Is this safe for providing JSONP?". stackoverflow.com. Retrieved 2012-09-07.
- ^ "JSON: The JavaScript subset that isn't". Magnus Holm. Retrieved 16 May 2011.
- ^ Oren Hafif (2014). "Reflected File Download - A New Web Attack Vector". TrustWave. Retrieved 2015-03-25.
- ^ "Practical JSONP injection".
- ^ Grossman, Jeremiah (January 27, 2006). "Advanced Web Attack Techniques using GMail". Retrieved July 3, 2009.
- ^ Michele, Spagnuolo. "Abusing JSONP with Rosetta Flash". Archived from the original on July 21, 2014. Retrieved July 20, 2014.
- ^ "Google - list of software vulnerabilities discovered or fixed by Googlers". Retrieved July 29, 2014.
- ^ "MITRE: CVE-2014-4671". Retrieved July 29, 2014.
- ^ "MITRE: CVE-2014-5333". Retrieved August 21, 2014.
- ^ "Adobe Security Bulletin APSB14-17". Retrieved July 29, 2014.
- ^ "Adobe Security Bulletin APSB14-18". Retrieved August 21, 2014.
- ^ "eval'ing JSON". July 19, 2005. Archived from the original on February 12, 2006.
- ^ "json: Message: Re: Comments". August 17, 2005.
- ^ "Remote JSON - JSONP". from __future__ import *. Bob.pythonmac.org. December 5, 2005. Archived from the original on December 4, 2009. Retrieved September 8, 2008.
외부 링크
- 서버 측 필터는 모든 응답을 jsonp 콜백(jsonp-tempers 소스 코드 사용)으로 처리함
- JSON과 관련된 잠재적인 보안 문제
- 원격 도메인의 JSONP 데이터 원본
