-
Notifications
You must be signed in to change notification settings - Fork 1
cross‐domain 로컬 환경에서 cookie로 인증 처리하기 with vite proxy ‐ 2024.11.20
우리 서비스는 카카오 oAuth로그인을 활용해 인증을 처리한다.
oAuth로그인이 성공하면 http only 쿠키를 받아온다. (accessToekn, refreshToken, isReftesh)
여기서 쿠키의 도메인은 서버 주소다! ( 예를 들어 111.111.111.11
)
배포환경일 때는 Domain이 같아서 잘 쿠키들이 담기겠지만 로컬에서 테스트할 때는 localhost
≠ 111.111.111.11
라서 쿠키들이 담기지 않는다.
httpOnly 옵션을 적용해서 직접 자바스크립트로 쿠키를 꺼내서 담아줄 수도 없다..
가장 간편한 방법은 쿠키에 sameSite옵션에 None으로 설정하는 건데
현재 알파 서버가 https
가 아닌 http
라서 안 된다.
sameSite None은 https에서만 동작한다..!
왜 HTTP에서 SameSite=None
이 동작하지 않을까? (gpt 답변)
-
SameSite=None
은 쿠키를 크로스 사이트 요청에서 사용하도록 허용 - 하지만 크로스 사이트 요청은 보안 위험(예: CSRF, 세션 하이재킹)을 동반할 수 있으므로, 이를 사용할 때 반드시
Secure
속성이 필요 -
Secure
속성은 HTTPS를 요구하므로, 결과적으로 HTTP 환경에서는SameSite=None
쿠키를 사용할 수 없음.
또 다른 방법을 찾아본 결과 vite proxy 서버를 이용해 해결할 수 있었다!
전체적인 해결 흐름은 다음과 같다.
-
vite proxy server 설정
-
서버로부터 개발용 임시 토큰 발급
-
응답 받은 토큰을 직접 js로 쿠키 설정
쿠키키 domain이 localhost로 설정됨!
-
api 요청 (웹브라우저 → vite proxy server)
모두 도메인이 localhost라서 cookie 전송 잘 됨
-
vite proxy server → 백엔드 서버 쿠키 전송
서버 간 통신이므로 쿠키가 전송 잘 됨
-
vite proxy server 설정
import { defineConfig, loadEnv } from 'vite'; import react from '@vitejs/plugin-react'; import tsconfigPaths from 'vite-tsconfig-paths'; // https://vite.dev/config/ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()); return { plugins: [react(), tsconfigPaths()], server: { host: true, open: true, proxy: { '/api': { target: env.VITE_SERVER_URL, changeOrigin: true, secure: false, }, }, }, }; });
target url을 env로 감싸기 위해
loadEnv(mode, process.cwd());
로 env 정보 가져와서 적용했다!++defineConfig 내에서 import.meta.env를 직접 사용할 수 없는 이유? (gpt 답변)
-
import.meta.env
는 브라우저나 빌드 프로세스에서 런타임에 사용됨 - 반면, Vite의 설정 파일(
vite.config.ts/js
)은 Node.js 환경에서 실행되며, 이 시점에는import.meta.env
가 정의되지 않는다.
-
-
서버에 개발용 임시 토큰 발급
const handleKakaoBtnClick = async () => { if (import.meta.env.DEV) { **const res = await login('jindding', '1234');** // ... return; } window.location.href = `${import.meta.env.VITE_API_URL}/auth/kakao`; };
accessToken을 response body에서 가져올 수 있다!
-
받아온 accessToken을 자바스크립트로 직접 설정
const handleKakaoBtnClick = async () => { if (import.meta.env.DEV) { const res = await login('jindding', '1234'); if ('error' in res) { setErrorCode(res.statusCode); return; } **document.cookie = `accessToken=${res.accessToken}; path=/;`;** return; } window.location.href = `${import.meta.env.VITE_API_URL}/auth/kakao`; };
document.cookie로 웹브라우저 쿠키저장소에 accessToken을 담는다.
이 때 cookie Domain은
localhost
가 된다! -
쿠키로 인증이 필요한 api 요청
웹브라우저, vite proxy server 모두 domain이 localhost라서 cookie가 잘 전달된다.
requestHeader Cookie에 accessToken이 잘 담기는 것을 확인할 수 있다!
-
vite proxy server → 백엔드 서버
export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()); return { plugins: [react(), tsconfigPaths()], server: { host: true, open: true, proxy: { '/api': { target: env.VITE_SERVER_URL, changeOrigin: true, secure: false, }, }, }, };
vite.config.ts에 설정해주었던대로 vite proxy server는 taget으로 지정한
VITE_SERVER_URL
로 요청하게 된다! 서버와 서버 간에 통신이므로 쿠키를 포함해서 보내게 된다.
++proxy 서버를 안두고 개발용 임시 토큰만 받는다면??
localhost ≠ 111.111.111.11 same site가 아니기 때문에 쿠키 전송 x
++ 서버에 개발용 임시 토큰을 발급하지 않는다면??
서버에 개발용 임시 토큰을 발급하지 않으면 쿠키 통신을 할 수 없다.
Why?
지금은 cookie의 domain이 서버(111.111.111.11
)다.
브라우저, vite proxy server 모두 localhost로 같은 도메인이지만 cookie 도메인이 다르기 때문에 전달되지 않는다!
→ 쿠키 도메인이 무조건 localhost여야 한다!
https://yozm.wishket.com/magazine/detail/2565/
https://0422.tistory.com/329
- [FE] 프론트엔드 기술스택
- [FE] 라이브러리 없이 차트 구현 이유
- [FE] Canvas API 사용방법
- [FE] 네비게이션 바 애니메이션 구현
- [FE] Socket.io 사용방법
- [FE] Tanstack Router에 대하여...
- [FE] Intl(Internationalization) API
- [FE] React Suspense 적용
- [FE] 한글 입력 방식의 유연성을 높인 검색 시스템 구현하기
- [BE] 백엔드 기술 스택
- [BE] SSE vs Socket.io
- [BE] Redis를 도입하게 된 계기
- [BE] ACG Rule을 활용한 Secure CI CD 파이프라인 구현
- [BE] Nginx 로드밸런싱을 통해 한국 투자 API 소켓 제한 극복
- [BE] 주가 지수 기능 개발 과정
- [BE] 매수 및 매도 기능 개발 과정
- [BE] 실시간 자산 조회 기능 개발 과정
- [BE] 단위 테스트
- [BE] redis를 이용한 한국투자 Open API 세션 관리
- [BE] 데이터베이스 인덱싱
- [FE] React에서의 DOM 요소 접근 (useRef vs getElementById)
- [FE] Outlet을 활용한 공통 레이아웃 관리
- [FE] react hooks가 특정 조건에서 실행되면 안되는 이유 & useQuery에 query function 매개변수가 undefined일 수도 있을 때 어떻게 해결할까
- [FE] cross‐domain 로컬 환경에서 cookie로 인증 처리하기 with vite proxy
- [FE] 크롬&사파리 Composition 차이
- [FE] useEffect 의존성 배열
- [BE] Naver Cloud Platform HTTPS 무응답 현상
- [BE] 한국투자 Open API에서 access token을 발급받지 못하는 문제
- [BE] 한국투자 Open API와 웹소켓 연결이 되지 않던 문제
- [BE] 한국투자 Open API 웹소켓 연결이 중단되는 문제
- [BE] 같은 주식 주문이 동시에 여러 번 체결되는 문제
- [BE] 한국투자 Open API Websocket 세션을 두 개에서 한 개로 변경하기
- [BE] Nginx 로드 밸런싱 중 Socket bad Request 발생하는 현상
- [BE] 매수/매도 체결 로직에 의해 redis pub/sub이 정상적으로 동작하지 않는 문제