본문 바로가기
React

[React] CORS 에러 (OPTIONS 요청 발생)

by dev수니 2021. 12. 24.
반응형

백엔드는 3001포트 프론트는3000 포트로 돌려서 axios 가져오려 할 때마다 cors가 말썽이다.

 

댓글을 삭제하기 위한 다음과 같이 백엔드 api

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 댓글 삭제
router.route('/reply/delete_reply').get((req, res) => {
    const idx = req.query.idx;
 
    if (pool) {
        replyDelete(idx, (err, result) => {
            if (err) {
                res.writeHead('201', { 'content-type''text/html; charset=utf8' });
                res.write('<h2>메인데이터 출력 실패 </h2>');
                res.write('<p>데이터가 안나옵니다.</p>')
                res.end();
            } else {
                res.send(result);
            }
        });
    }
})
 
// 댓글 삭제
const replyDelete = function (idx, callback) {
    pool.getConnection((err, conn) => {
        if (err) {
            console.log(err);
        } else {
            conn.query('delete from reply_like where replyIdx = ?', [idx]);
 
            conn.query('select EXISTS (select idx from reply where parentIdx = ? limit 1) as success;', [idx], (err, result) => {
                if (err) {
                    console.log(err);
                }
 
                if (result[0].success == 1) {
                    conn.query('update reply set memberIdx = ?, content = ? where idx = ?', [null'삭제된 댓글입니다.', idx]);
                } else if (result[0].success == 0) {
                    conn.query('delete from reply where idx = ?', [idx]);
                }
 
                conn.release();
                if (err) {
                    callback(err, null);
                    console.log('select문 오류')
                    return;
                } else {
                    callback(nulltrue);
                }
            })
        }
    })
}
cs

 

아래 프론트에서 delete axios요청

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // 댓글 삭제 실행
    const delReply = (replyIdx)=>{
        axios.get('http://localhost:3001/reply/delete_reply?idx='+replyIdx)
        .then(function (response) {
            console.log(response);
            alert('삭제되었습니다.');
            window.location.href="/detail/"+idx+"?idx="+param;
        })
        .catch(function (error) {
            alert('삭제 실패했습니다.');
            console.log(error);
        })
        .then(function () {
        });
    }
cs

 

실행결과 다음과 같은 cors 에러가 발생했다....

DELETE가 blocked 되었다.

 

또한 터미널에도 DELETE가 아닌 OPTIONS로 요청되었다고 찍힌다.

 

 

찾아보니까 다음과 같다.

https://nukeguys.github.io/dev/options-request/

 

[TIL] `OPTIONS` 요청은 왜 발생하는가?

웹 개발을 하다 보면 네트워크 요청시 실제 원하는 요청(GET, PUT, POST, DELETE 등)전에 OPTIONS 요청이 발생하는 것을 볼 수 있다. 이게 뭘까하고 응답값을 확인하면 아무것도 없다. 응답값이 없는 이

nukeguys.github.io

 

CORS(Cross-Origin Resource Sharing)란 웹페이지의 서버가 다른 서버의 리소스를 요청하는 것을 의미한다.

이는 유용하면서도 보안상의 문제점을 갖고 있다. 웹사이트에서 악의적인 목적으로 외부로 정보를 보내거나 하는 등의 요청을 보낼 수 있기 때문이다. 따라서 브라우저는 OPTIONS preflight하여 서버에서 허용하는 옵션을 미리 확인하고, 허용되지 않은 요청의 경우 405(Method Not Allowed)에러를 발생시키고 실제 요청은 전송하지 않는다.

 

아래 조건들 중 하나라도 만족하지 않으면 preflight 요청을 보내게 된다고 한다. 모두 만족하면 OPTIONS 없이 요청을 보낸다.

1. get, head, post 요청 중 하나
2. user agent에 의해 자동으로 설정되는(Connection, User-Agent, Fetch 스펙상 forbidden header로 정의되어 있는) 헤더외에 CORS-safelisted request-header로 명시된 헤더들만 포함된 경우(Accept, Accept-Language, Content-Language, Content-Type 등)
3. Content-Type은 application/x-www-form-urlencoded, multipart/form-data, text/plain만 허용

 

 

문서를 읽어보니 결과적으로 내가 요청한 delete 때문이었다.

따라서 http 메서드을 get 으로 변경했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 댓글 삭제
router.route('/reply/delete_reply').get((req, res) => {
    const idx = req.query.idx;
 
    if (pool) {
        replyDelete(idx, (err, result) => {
            if (err) {
                res.writeHead('201', { 'content-type''text/html; charset=utf8' });
                res.write('<h2>메인데이터 출력 실패 </h2>');
                res.write('<p>데이터가 안나옵니다.</p>')
                res.end();
            } else {
                res.send(result);
            }
        });
    }
})
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    // 댓글 삭제 실행
    const delReply = (replyIdx)=>{
        axios.get('http://localhost:3001/reply/delete_reply?idx='+replyIdx)
        .then(function (response) {
            console.log(response);
            alert('삭제되었습니다.');
            window.location.href="/detail/"+idx+"?idx="+param;
        })
        .catch(function (error) {
            alert('삭제 실패했습니다.');
            console.log(error);
        })
        .then(function () {
        });
    }
cs

아주 잘된다.

반응형

'React' 카테고리의 다른 글

[React Query] React query 뿌수기  (0) 2024.04.09
[React] 렌더링 최적화하는 방법  (0) 2022.03.10
[React] 리액트 댓글 좋아요 구현하기  (0) 2021.12.23

댓글