서버측에서 Ajax 전송 판별 방법


기존 Form 방식과 Ajax 통신 방식을 서버에서 구분하는 방법은 존재하지 않습니다.(HTML5 명세를 제외)


하지만 트위터와 같은 몇몇 서비스의 HTTP 요청헤더를 살펴보면 X-Requested-With 필드에 "XMLHttpRequest" 값이 포함된 것을 종종 볼 수 있습니다.


- 여기서 헤더의, 접두사 "X"는 표준이 아님을 의미합니다. (Non-standard)



또한, 이 X-Requested-With 헤더는 커스텀(사용자 정의)헤더이며, 표준이 아닙니다.


하지만 다행히도 JQuery와 Prototype 같은 대중성 있는 라이브러리들이 이 헤더를 Ajax 전송 시 기본으로 추가하여 전송하고 있습니다.


또한, HTML5 명세로 넘어와서는 Origin 헤더의 유/무 로 판별이 가능해 졌지만, 이 방법 또한 IE 브라우저에서는 8+ 이상 부터 지원하고 있기 때문에 아직까지는 사용상 무리가 따르는 것이 사실입니다.


즉, 이를 완벽히 구현하기 위해서는 각 브라우저 환경에 맞도록 클라이언트와 서버 프로그램을 설계해야 하는 추가적인 작업이 들어갑니다.


- 이 방법에 대해서는 다음 포스트인 "CORS" 에서 더 자세히 다루도록 하겠습니다.(클라이언트 및 서버 구현)





아래 코드는 위에서 설명해 드린 "X-Requested-With"와 "Origin" 헤더 유/무를 통해 서버에서 Ajax 전송을 판별하는 과정입니다.




1. 동일 도메인(NOT CORS)일 경우:


서버측 코드:


  1. if ((Request.Headers["X-Requested-With"] != null && Request.Headers["X-Requested-With"].ToLower() == "xmlhttprequest")
  2.     || Request.Headers["ORIGIN"] != null)
  3. {
  4.     Response.Write("ajax");
  5.     Response.End();
  6. }




GET 방식 실행결과:


위에서 언급한 바와같이 커스텀헤더인 "X-Requested-With" 헤더가 클라이언트 전송 시 포함되어있다.








POST 방식 실행결과(OPTIONS 메서드 요청 > GET 메서드 요청):


위에서 언급한 바와같이 커스텀헤더인 "X-Requested-With" 헤더가 클라이언트 전송 시 포함되어있다.









2. 타 도메인(CORS 통신)일 경우:


서버측 코드:


  1. Response.AddHeader("Access-Control-Allow-Origin", "*");
  2.  
  3. if ((Request.Headers["X-Requested-With"] != null && Request.Headers["X-Requested-With"].ToLower() == "xmlhttprequest")
  4.     || Request.Headers["ORIGIN"] != null)
  5. {
  6.     Response.Write("ajax");
  7.     Response.End();
  8. }




GET 방식 실행결과(GET 메서드 요청):


위에서 언급한 바와같이 HTML5 명세부터 적용된 Origin 헤더가 클라이언트 전송 시 포함되어있다.








POST 방식 실행결과(OPTIONS 메서드 요청 --> GET 메서드 요청):



위에서 언급한 바와같이 HTML5 명세부터 적용된 Origin 헤더가 클라이언트 전송 시 포함되어있다.




- OPTIONS --> POST 메서드 요청






- OPTIONS 메서드 요청






- POST 메서드 요청






- 결과: 







3. (CORS 통신 + Custom Header) 추가 시



3.1. 기본 CORS GET 요청 시: 


기본적인 CORS 통신은 위 설명과 같이 문제없이 구동된다.


3.2. CORS GET/POST 요청 + Custom Header(사용자 정의 헤더) 추가 시:  


총 두 번의 요청(OPTIONS + GET/POST)이 발생하며, 관련 헤더를 추가하기 전까지는 해당 요청 시 에러가 발생한다.



3.3. CORS GET/POST 요청 시 추가적인 OPTIONS 메서드 요청이 발생하는 이유는?  


- 해당 서버에서 요청 URL 허용(Access-Control-Allow-Origin) 유/무를 확인하기 위함.





3.4. 해결 방법(관련 헤더 추가)은?



조건: CORS GET/POST 요청 + Custom Header(사용자 정의 헤더) 추가





- 클라이언트 단 소스(x-sid(사용자 헤더))





- 서버 단(web.config) 소스:


* "HTTP Module" 을 통해 개별적(리소스 별) 적용 방법도 가능할 것이다.






- 실행 결과:



첫 번째 요청인 OPTIONS 메서드 요청 시 메시지 헤더 값:







- 두 번째 요청인 GET 메서드 요청 시 메시지 헤더 값:







참고 사이트:


다니엘님의 CORS(Custom Header) 정리 글.


http://daeheehan.cafe24.com/wp/?p=274


http://parkmo.egloos.com/4155695


html5rocks CORS 정리글(추천)

http://www.html5rocks.com/en/tutorials/cors/