본문 바로가기

Dot Programming/Node.js

[Node.js] Cors 설정 ( credentials )

    Cors 설정하기 

    지금 나의 노드 서버 통신구조는 이렇게 되어있다. 브라우저- 프론트간의 통신은 괜찮지만 백서버랑 브라우저 서버 사이의 통신을 할 때 Cors 보안 정책 위반으로 에러가 난다.

    브라우저(port: 3060) - 프론트 서버(port: 3060) - 백엔드 서버(port: 3065)

     

    Proxy 방식

    브라우저 ->  백엔드 서버로 통신하기 위해서 중간에 프론트 서버를 넣는 방식이다. (브라우저가 아닌 서버와의 통신 또한 Cors정책 위반이 아니다)

    브라우저 > 프론트엔드 > 백엔드 

     

    1. header에 'Access-Control-Allow-Origin' 넣기

    router/user.js

    router.post('/', async(req, res) => { // POST /user/
        
        try{
            const exUser = await User.findOne({
                where: {
                    email: req.body.email,
                }
            });
    
            if(exUser){
                return res.status(403).send('이미 사용중인 아이디입니다.');
            }
    
            const hashedPassword = await bcrypt.hash(req.body.password, 10);
            await User.create({
                email: req.body.email,
                nickname: req.body.nickname,
                password: hashedPassword,
            });
            
            // cors
            res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3060'); 
            res.status(200).send('ok');
    
        } catch(error){
            console.error(error);
            next(error);
        }  
    });

     

    2. npm cors (check)

    $ npm i cors

    api마다 header에 계속 넣어주는 것보다 전역으로 설정이 가능해서 이 방식을 사용할 것이다

     

    app.js

    const express = require('express')
    const cors = require('cors');
    
    const app = express();
    
    
    app.use(cors({
        origin: '*',
       // credential: ?
    }));

    origin

    * (모든 주소 허용) 실무에서 설정안하면 해킹 위험있음
    true // * 대신 보낸 곳의 주소가 자동으로 들어가 편리함.

    credentials

    기본값 false
    사용자 인증이 필요한 리소스 접근이 필요한 경우 true를 설정해야 한다. (후에 true로 바꿀 예정)

     

    이렇게하면 cors 설정 끝

     

    인증 회원 401 error (credentials : true)

    그런데 이제 더 나아가서 게시글 업로드 파트가 왔다. 인증을 받고 이젠 인증된 회원이 게시글 업로드하려고 하면 401 error가 뜰 것이다. 왜냐하면 credentials를 true로 안해줬기 때문이다.

     

    각 saga api axios 내부안에 true로 바꿔주는 방법도 있지만 너무 번거롭고 이를 한번에 하는 방법이 있다.

     

    /sagas/index.js

    axios.defaults.withCredentials = true;

     

    이렇게하면 saga의 모든 axios통신들의 credentials는 true로 전환된다. 그런데 이렇게하고 다시 플젝을 실행하고 로그인을 하면 또 cors정책을 위반해줬다고 뜰 것이다. 

     

     

     

    에러메세지를 읽으면 알겠지만 이는 백엔드 서버에서 cors origin을 *(모든 주소 허용)로 설정해서 생긴 오류였다.

     

    back/app.js

    app.use(cors({
        origin: 'http://localhost:3060',
        credentials: true,
    }));

    위와 같이 origin에 프론트서버 주소를 명시해주면 된다.

    (origin: true 도 가능)

     


    ※ 참고

    인프런 -노드버드 만들기

    https://velog.io/@logqwerty/CORS