작성
·
32
·
수정됨
0
아래 코드는 강사님의 git에서 가져온 코드입니다.
auto
// [Next.js 프로젝트]
// pages/blog/index.js
import { useEffect, useState } from "react";
export async function getServerSideProps(context) {
// http://localhost:3000 에서의 쿠키를 API 요청에 활용
const headers = {
Cookie: context.req.headers.cookie,
};
console.log("headers: ", headers);
const url = "http://localhost:8000/blog/whoami/";
const response = await fetch(url, { headers });
const responseText = `상태코드: ${response.status}
${await response.text()}`;
// props로 전달한 값이 컴포넌트의 속성값으로 주입
return { props: { message: responseText } };
}
// 웹브라우저에 코드가 다운로드된 후에 수행.
function WhoamiPage({ message: messageSSR }) {
const [messageCSR, setMessageCSR] = useState("no message");
// 컴포넌트 초기화 시에 1회만 실행.
useEffect(() => {
fetch("http://localhost:8000/blog/whoami/")
.then((response) => response.text())
.then((responseText) => {
setMessageCSR(responseText);
});
}, []);
return (
<div>
<h2>whoami</h2>
<pre>CSR: {messageCSR}</pre>
<pre>SSR: {messageSSR}</pre>
<hr />
<small>by Next.js</small>
</div>
);
}
export default WhoamiPage;
강의에선
"fetch api 에서 config 설정도 없이 protocol host 포트 번호를 제거하고 호출합니다..."라고 말씀하셨습니다.
그런데 위 코드는 protocol + host + port 번호까지 전부 적혀 있는 상태이지 않나요?
그런 이유로 해당 코드는 localhost:3000/blog에서 CORS 오류가 발생합니다.
저 코드를 사용하신 이유를 잘 모르겠어요.
답변 2
0
안녕하세요.
첫번째 스샷의 코드는 Next.js 코드로서 서버 단에서 장고 서버로 fetch 호출하는 하는 코드입니다. Next.js 에서는 getServerSideProps 함수는 서버 단에서 호출됩니다. 그러니 세션 인증을 위해서, 장고 요청의 sessionid 쿠키를 요청 헤더에 담아서 보냈어야 했구요.
그 다음에 보여주신 코드는 웹브라우저 단에서 수행되는 fetch 코드입니다. 웹 브라우저 단에서 호출을 하니, 브라우저에서 알아서 sessionid 세션쿠키를 전송해주니까 별도로 헤더 설정이 필요없는 상황이 된 것입니다.
같은 JS 코드이지만, 어느 단계에서 수행되는 지에 따라 필요한 설정이 달라집니다.
살펴보시고, 댓글 부탁드립니다.
질문에 감사드립니다. :-)
브라우저의 현재 주소가 http://127.0.0.1 로 되어있다면, fetch 시에 localhost로 지정하시면, 127.0.0.1과 localhost는 같은 대상을 가리키더라도 브라우저 입장에서는 엄연히 다른 주소이기에 CORS 이슈가 발생할 수 있습니다.
같은 호스트라면, 말씀하신 대로 서버의 호스트명을 제외한 /blog/whoami/ 처럼 주소를 지정해주시는 것이, 코드 관리성 측면에서도 유리합니다. 호스트가 변경되더라도 소스코드를 변경할 필요가 없으니깐요. :)
0
안녕하세요, 인프런 AI 인턴입니다. bigseoul님!
Next.js 프로젝트에서 API 호출 시 CORS(Cross-Origin Resource Sharing) 오류가 발생하고 있는 상황이시군요.
강의 내용에서는 fetch API 호출 시 백엔드 서버의 프로토콜, 호스트, 포트 번호를 직접적으로 명시하지 않고, 상대 경로를 사용하는 방법을 설명하고 있을 것입니다. 코드의 fetch 호출 부분에서 http://localhost:8000/blog/whoami/
와 같은 절대 경로를 사용하면 CORS 오류가 발생할 가능성이 있습니다. CORS는 브라우저 보안 기능 중 하나로, 도메인이 다른 리소스에 요청이 간 경우 접근을 제한합니다.
상대 경로 사용: next.js의 API 라우트를 사용하여 상대 경로를 통해 API 호출을 수행하세요. 상대 경로로 API를 호출할 경우 클라이언트와 서버가 동일한 도메인에서 실행되는 것처럼 간주되므로 CORS 문제를 방지할 수 있습니다. 다음과 같이 상대 경로를 사용해 보세요.
fetch("/api/blog/whoami/")
백엔드 서버의 CORS 설정 수정: 실제로 API 서버의 CORS 설정에서 클라이언트 도메인(http://localhost:3000
)을 허용하도록 변경해 주세요.
이러한 방법들로 해결할 수 있습니다. 관련한 자세한 설명은 유관 강의 내용에 포함돼 있을 수 있으니 다시 확인해 보시면 도움이 될 것입니다.
유사한 이슈에 대한 답변을 참고하실 수 있는 게시물을 아래에 소개합니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
후자가 맞는 설정인거죠?