개발

서로 다른 도메인 간 쿠키 공유

조강철10 2025. 5. 29. 13:32
반응형

 

로컬 환경에서는 SNS 로그인 시 토큰이 쿠키에 잘 저장되어,

로컬로 연 백엔드 서버에 잘 전달이 되었습니다.

 

그런데, 배포를 하고나니 로그인 후 401 에러가 계속 발생하는 현상을 발견했습니다.

 

401 에러는 웹 서버가 요청된 리소스에 대한 유효한 인증 자격 증명이 없다고 판단했을 때 발생합니다. 즉, 사용자 인증이 필요하거나, 잘못된 인증 정보가 제공되었을 때 나타납니다.

 



찾아보니까, 엑세스 토큰이 전달되지 않아서 401에러가 발생했던 거 였습니다.

그러면 왜?? 로컬에서는 토큰이 잘 전달되었는데 배포를 하니까 전달이 되지 않았을까요??

 

정답은 도메인이 서로 달라서 였습니다.

 

제 서비스는 프론트 도메인과, 백엔드 서버의 도메인이 서로 다릅니다.

그렇기 때문에 쿠키가 제대로 전달이 되지 않아 서비스를 이용할 수 없었던 것 이었습니다.

 

해결하기

 

res.cookie('jwt_token', jwtToken, {
            httpOnly: true, // JavaScript에서 쿠키에 접근할 수 없도록 설정
            secure: process.env.NODE_ENV === 'production', // HTTPS에서만 쿠키 전송
            sameSite: 'lax', // CSRF 공격 방지
            maxAge: 24 * 60 * 60 * 1000 // 24시간
        });

 

제 경우, 로그인 부분 코드에서, sameSite: 'lax'로 되어 있어서,

도메인이 서로 다를 경우 쿠키가 전달되지 않았습니다.

 

sameSite 옵션은?

 

쿠키가 어떤 도메인에서만 사용할 수 있는지 설정할 수 있는 옵션은 Domain 옵션과 sameSite 옵션이 있습니다.

sameSite 옵션은 stirct, lax, none 3가지의 옵션이 존재합니다.

 

- strict : 반드시 같은 도메인에서만 사용 가능

- lax : 같은 도메인에서만 사용 가능하지만 유저가 링크로 바로 접속하는 경우 다른 도메인에서도 사용 가능

- none : 다른 도메인에소도 사용 가능, secure 옵션을 함께 사용해야 함.

 

 

코드를 다음과 같이 수정하니 정상적으로 쿠키가 프론트 서버에서 백엔드 서버로 전달되었습니다!

 

res.cookie('jwt_token', jwtToken, {
            httpOnly: true, // JavaScript에서 쿠키에 접근할 수 없도록 설정
            secure: process.env.NODE_ENV === 'production', // HTTPS에서만 쿠키 전송
            sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', // CSRF 공격 방지
            maxAge: 24 * 60 * 60 * 1000 // 24시간
        });
반응형