티스토리 뷰

반응형

동작 원리 (1) - 기본

동작하게 만드는 것은 간단히 다음과 같이 헤더를 추가하는 방식으로 하는데,

요청 헤더를 통해 Origin에 대한 정보를 데이터를 받을 서버로 보내면,

데이터를 줄 서버에서 Origin을 검증하여 브라우저가 권한을 확인하게 한다.

동작 원리 (2)에 조금 더 자세한 내용이 있다.

 

단, MDN에 의하면 요청 헤더인 Origin은 프로그래밍 방식으로 변경할 수 없다.

(즉 소스코드에 의해 Origin 요청 헤더를 추가하거나 제외할 수 없다.)

forbidden header name is the name of any HTTP header that cannot be modified programmatically;

그러므로 아래에 나올 코드(요청 단)가 아닌 서버에서 CORS를 활성화 해야한다.

 

HTTP 요청 헤더 

Origin 요청을 전송한 출처를 서버에게 알림
Access-Control-Request-Method 실제 요청시 클라이언트가 사용할 HTTP 요청 메소드(GET, POST, PUT 등)를 서버에게 알림
Access-Control-Request-Headers 실제 요청시 클라이언트가 보내게 될 HTTP 헤더를 서버에게 알림

 

HTTP 응답 헤더 

Access-Control-Allow-Origin 리소스가 공유될 수 있는 출처를 클라이언트에게 알림
Access-Control-Allow-Credentials 자격증명이 있는 요청에 대해 true로 설정 시 자바스크립트에 응답을 노출
Access-Control-Allow-Methods 리소스에 접근할 때 허용되는 HTTP 요청 메소드를 클라이언트에게 알림
Access-Control-Allow-Headers 실제 요청에 허용되는 HTTP 헤더를 클라이언트에게 알림
Access-Control-Expose-Headers 응답으로 노출될 수 있는 헤더를 클라이언트에게 알림
Access-Control-Allow-Max-Age Access-Control-Allow-Methods, Access-Control-Allow-Headers 헤더를 캐시할 수 있는 기간을 클라이언트에게 알림

 

 

 

동작 원리 (2) - Request 소스코드 구성

JavaScript 예시

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CORS</title>
</head>
<body>
    <!-- 안녕하세요 또야의 CORS 세계에 온 것을 환영합니다아~! -->
    Welcome to 또야's CORS world~
</body>
<script>
    // XMLHttpRequest 객체를 생성합니다.
    var httpRequest = new XMLHttpRequest();
    // 데이터를 받아올 서버 url을 선언합니다.
    var url = "https://api.example.com/api/.../..."
    // 받아올 데이터를 선언합니다.
    var data;
    // 요청에 대한 상태값이 변경될 때,
    httpRequest.onreadystatechange = function() {
        // 요청에 대한 처리가 완료되고 status code가 200일 때 
        if(httpRequest.readyState == 4 && httpRequest.status == 200) {
            // 요청한 JSON 데이터를 string으로 변환해서 처리하도록 구현합니다. (예시)
            data = JSON.parse(httpRequest.responseText)
        }
    };
    // data 처리문 생략

    // 위 선언한 api 서버에 GET 요청을 하도록 지정합니다.
    httpRequest.open('GET', url);
    // 지정한 대로 HTTP 요청을 전송합니다. 이후 서버에서 요청사항을 처리하면 httpRequest.onreadystatechange 함수가 실행됩니다.
    httpRequest.send();
</script>
</html>

 

XHR 객체를 통한 데이터 교환 흐름은 아래 그림에 잘 설명되어 있다.

먼저 1) 객체를 생성한 후 2) open() 메서드로 어디에 보낼지 지정하고, 3) send() 메서드로 요청한다.

4) 서버에서 요청사항을 처리 후, 5) readyState 속성값이 변경되고 6) js 로직에 따라 처리한다.

http://mm.sookmyung.ac.kr/~sblim/lec/xml-PBL/xml16-81ajax.htm

 

위 코드의 readyState == 4는 처리가 완료되었다는 코드이다.

하나만 알아보면 안되니까 다 알아본다.

 

readyState 상태값

readyState value Description
0 XMLHttpRequest 객체만 생성되고 open 메서드는 호출되지 않음
1 open 메서드가 호출됨
2 send 메서드가 호출됨
3 데이터를 받는 중
4 데이터를 모두 받았음

 

다음 글에서는 요청 단이 아닌 응답 헤더를 다양한 환경에서 설정하는 방법을 작성한다.

 

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요