Access to XMLHttpRequest at 'https://port-0-road-pick-be-mavxgd0f1140ffb1.sel4.cloudtype.app//auth/profile' from origin 'https://roadpick.vercel.app' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

배포 환경에서 로그아웃 안되는 이슈

router.post(
  '/login',
  ...생략
      res
        .cookie('token', token, {
          httpOnly: true,
          secure: process.env.NODE_ENV === 'production',
          sameSite: process.env.NODE_ENV === 'production' ? 'None' : 'Lax',
          path: '/',
          maxAge: 1000 * 60 * 60, // 1시간
        })
        .json({ message: '로그인 성공' })
    } catch (err) {
      console.error(err)
      return res.status(500).json({ message: '서버 에러' })
    }
  }
)
// ── 로그아웃
router.post('/logout', (req, res) => {
  res
    .cookie('token', '', {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production',
      sameSite: 'Strict',
      path: '/',
      maxAge: 0,
    })
    .json({ message: '로그아웃 되었습니다.' })
})

쿠키 설정 시 secure과sameSite와 로그아웃 시에도 로그인 시와 동일한 쿠키 옵션(sameSite, secure, path)을 사용해야 쿠키가 제대로 삭제된다.

해결

// ── 로그아웃
router.post('/logout', (req, res) => {
  res
    .cookie('token', '', {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production',
      sameSite: process.env.NODE_ENV === 'production' ? 'None' : 'Lax',
      path: '/',
      maxAge: 0,
    })
    .json({ message: '로그아웃 되었습니다.' })
})