
CORS 설정과 관련해 문제 해결 경험을 기록한다
하나의 프로젝트 레포 안에서 서버 폴더는 Express로 , 클라이언트 폴더는 React와 TypeScript를 사용했다
프로젝트 배포 전에는 postman으로 서버 기능을 테스트했고 npm start 명령어로 클라이언트 화면을 보면서 작업했다
그런데 문제는 클라이언트에서 서버에 요청을 보내면 서버와의 연결이 되지 않는 것이었다
원인은 CORS(Cross-Origin Resource Sharing) 설정이었다
CORS는 간단히 말하면 서로 다른 출처(예: 서로 다른 도메인, 포트) 간의 통신을 허용하거나 제한할 수 있게 해주는 보안 기능이다
기본적으로 출처가 다른 경우에는 쿠키나 인증 관련 헤더(예: Authorization 헤더)를 포함한 요청을 보낼 수 없다
때문에 클라이언트가 서버에 인증 정보를 담아 요청을 보내려면 프론트엔드와 서버 양측에서 CORS 설정을 해야한다
먼저 서버 코드에 이런식으로 추가해야 한다
app.use(
cors({
origin: "http://localhost:9000",
credentials: true,
})
);
app.use(express.json());
origin 옵션에는 작업중인 클라이언트의 URL을 적어주면 된다
(물론 배포후에는 배포한 클라이언트의 URL로 바꿔줘야한다)
여기서 credentials이 나오는데, credentials 옵션은 인증 정보를 포함한 요청에 관한 옵션이다
true로 설정해주면 요청을 허용해 클라이언트에서 서버로 인증 정보를 담아 요청을 보낼 수 있게된다
다음으로, 클라이언트 코드는 fetch API로 이렇게 수정했다
export const loginUser = async (username: string, password: string) => {
const response = await fetch(`${baseURL}/auth/login`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, password }),
credentials: "include",
});
if (!response.ok) {
throw new Error("Failed to login");
}
return await response.json();
};
export const logoutUser = async () => {
const response = await fetch(`${baseURL}/auth/logout`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
credentials: "include",
});
if (!response.ok) {
throw new Error("Failed to logout");
}
};
credentials: "include",로 설정해주면 모든 요청에 인증 정보를 담아간다
이 옵션은 총 3가지 값을 사용할 수 있다
- same-origin (기본값) : 같은 출처 간 요청에만 인증 정보를 담는다.
- include : 모든 요청에 인증 정보를 담는다.
- omit : 모든 요청에 인증 정보를 담지 않는다.
참조 : https://velog.io/@garcon/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-CORS%EC%99%80-credentials
'Backend Basics > WebSecurity' 카테고리의 다른 글
세션 쿠키 속성 Secure, SameSite, HttpOnly 뭐임 (0) | 2024.10.22 |
---|---|
HTTP 뒤에 있는 숫자 뭐지?! (HTTP 상태코드) (1) | 2024.10.17 |
쿠키 토큰 세션 JWT 존맛탱? 뭐임 (0) | 2024.09.25 |