Node.js

CORS 에러 이해하기

쿠와와 2021. 1. 11. 12:40

CORS에러

브라우저간의 데이터를 주고받는 과정에서, 도메인 이름이 서로 다른 사이트간에 api요청을 할 때, 공유를 설정하지 않았다면 CORS에러가 발생한다. -> 서버가 발생시키는 것이 아니고 브라우저가 발생시키는 것이다. 그러나 해결은 서버에서 해줘야한다. (그렇기 때문에 초보자가 어려워 하는 것이다.)

 

브라우저(1111포트) - 프론트서버(1111포트) - 백엔드서버(2222포트)

 

위와 같이 브라우저와 서버간 관계가 있을때, 브라우저에서 도메인/포트가 다른 백엔드 서버로 요청이 갔을때, 보안을 위해 자체적으로 요청이 차단된다. CORS는 브라우저에서 발생하는 것이기 때문에 프론트서버-백엔드서버간 요청은 포트가 다르더라도 에러가 나지 않는다. 때문에 이점을 이용해 CORS를 해결할 수 있고, 간편하게 미들웨어를 설치하여 해결하기도 한다.

 

nodecat 프런트 작성하기

프런트에서 서버의 API를 호출하면 어떻게 될까?

  • routes/index.jsviews/main.html 작성

프런트에서 요청 보내기

localhost:4000에 접속하면 에러 발생

요청을 보내는 프런트(localhost:4000), 요청을 받는 서버(localhost:8002)가 다르면 에러 발생(서버에서 서버로 요청을 보낼때는 발생하지 않음)

  • CORS: Cross-Origin Resource Sharing 문제
  • POST 대신 OPTIONS 요청을 먼저 보내 서버가 도메인을 허용하는지 미리 체크

CORS 문제 해결 방법

Access-Control-Allow-Origin 응답 헤더를 넣어주어야 CORS 문제 해결 가능

  • res.set 메서드로 직접 넣어주어도 되지만 패키지를 사용하는게 편리
  • npm i cors
  • v2 라우터에 적용
  • credentials: true를 해야 프런트와 백엔드 간에 쿠키가 공유됨

 

CORS 적용 확인하기

 

http://localhost:4000에 접속하면 정상적으로 토큰이 발급됨

응답 헤더를 보면 Access-Control-Allow-Origin 헤더가 들어 있음

  • *은 모든 도메인을 허용함을 의미

클라이언트 도메인 검사하기

클라이언트 환경에서는 비밀키가 노출됨

  • 도메인까지 같이 검사해야 요청 인증 가능
  • 호스트와 비밀키가 모두 일치할 때만 CORS를 허용
  • 클라이언트의 도메인(req.get(‘origin’))과 등록된 호스트가 일치하는 지 찾음
  • url.parse().hosthttp같은 프로토콜을 떼어내기 위함
  • cors의 인자로 origin을 주면 * 대신 주어진 도메인만 허용할 수 있음

 

유용한 미들웨어 패턴 알아보기

위의 미들웨어를 아래처럼 수정 가능

  • 아래처럼 쓰면 미들웨어 위 아래로 임의의 코드를 추가할 수 있음
  • 활용 가능

CORS 요청 보내기

localhost:4000에 접속

  • 응답 헤더의 도메인 확인

 

프록시 서버

CORS 문제에 대한 또다른 해결책

  • 서버-서버 간의 요청/응답에는 CORS 문제가 발생하지 않는 것을 활용
  • 직접 구현해도 되지만 http-proxy-middleware같은 패키지로 손쉽게 연동 가능

'Node.js' 카테고리의 다른 글

Nodejs Test하는 이유와 Jest  (0) 2021.01.12
API 서버에서 사용량 제한하기  (0) 2021.01.11
Nodejs 호출 서버 만들기  (0) 2021.01.10
Node에서 API 서버 만들기  (0) 2021.01.08
multer 사용해서 이미지 업로드 구현  (0) 2021.01.06