[FE] React Native에서 Amplitude 쿠키 에러 해결하기
FE
- 01 [FE] 새로고침 해도 이미지를 유지하는 방법
- 02 [FE] React Native에서 Amplitude 쿠키 에러 해결하기
- 03 [FE] 혼돈 속에서도 지속되는 프로덕트를 위해 — 도메인 기반 구조 리빌드 기록
React Native 앱에 Amplitude를 붙이다 마주친 성가신 에러가 있었습니다.
Failed to set cookie for key: AMP_TEST
Failed to set cookie for key: AMP_123456789
분명 앱은 잘 돌아가는데 콘솔은 지저분해지는 상황이 발생하길래,,
클로드와 함께 이게 왜 발생하는지, 그리고 어떻게 깔끔하게 해결하는지 정리해봤습니다.
문제의 원인
React Native는 Browser가 아니다.
문제의 핵심은 간단합니다. React Native는 웹 브라우저가 아닙니다.
브라우저에 있는 것들:
- ✅
document.cookie - ✅
localStorage,sessionStorage - ✅ 쿠키 스토리지
React Native에 있는 것들:
- ❌ 위의 모든 것
- 하 이것 때문에 처음 RN 할 때 레전드 빡쳤었구요
- ✅
AsyncStorage(네이티브 모듈) 얘만 믿고 가야하구요.
Amplitude SDK의 동작 방식
Amplitude의 TypeScript 코어는 기본적으로 브라우저 환경을 전제로 설계되어 있습니다. 초기화 과정을 보면:
- 쿠키 스토리지 사용 시도 (최우선 순위)
- RN에는 쿠키가 없으므로 실패
Failed to set cookie...에러 로그 출력- AsyncStorage로 fallback하여 정상 작동
결과적으로는 잘 작동하지만, 불필요한 시도와 에러 로그가 남는 구조입니다.
해결 방법
한 줄로 끝내기
import * as amplitude from "@amplitude/analytics-react-native";
export const initAmplitude = async (apiKey: string) => {
await amplitude.init(apiKey, undefined, {
disableCookies: true,
trackingOptions: {
deviceId: true,
sessionId: true,
platform: true,
},
}).promise;
};
disableCookies: true가 하는 일
-
쿠키 저장 경로 자체를 완전히 비활성화
-
쿠키 시도 -> 실패 -> fallback 과정 제거
-
콘솔 경고 완전 제거
-
초기화 속도
미세하게개선-
disableCookies: false (기본값)
- 쿠키 접근 시도 (1-3ms) → 실패 처리 → AsyncStorage 접근
- 총 초기화: ~50-100ms
-
disableCookies: true
- AsyncStorage 직접 접근
- 총 초기화: ~45-95ms
-
개발/프로덕션 환경 분리
당연하게도 환경별로 설정을 분리하는 게 좋습니다. 프로덕션은 달라야겠죠?
const getAmplitudeConfig = () => {
const base = {
disableCookies: true,
trackingOptions: {
deviceId: true,
sessionId: true,
platform: true,
},
};
if (__DEV__) {
return {
...base,
logLevel: amplitude.Types.LogLevel.Verbose,
minIdLength: 1,
};
}
return base;
};
주의사항
RN에서 쓰면 안 되는 웹 전용 옵션들
아래 옵션들은 Browser SDK 전용입니다.RN 공식 문서에 없다면 절대 사용하시면 안되구요..
{
defaultTracking: { ... },
cookieDomain: "...",
cookieExpiration: 365,
useBatch: true,
fileDownloads: true,
pageViews: true,
formInteractions: true
}
Session Replay를 사용하는 경우
Session Replay는 민감 정보를 포함할 수 있어 마스킹 설정이 매우 중요합니다.
const sessionReplay = new SessionReplayPlugin({
autoStart: false,
maskAllInputs: true,
maskAllTextContent: true,
sampleRate: __DEV__ ? 0.05 : 0.01,
});
성능 비교
| 항목 | disableCookies: false | disableCookies: true |
|---|---|---|
| 콘솔 경고 | 지속적으로 출력 | 완전 제거 |
| 초기화 성능 | fallback 비용 존재 | AsyncStorage 직행 |
| 스토리지 일관성 | 쿠키 실패 후 AsyncStorage | AsyncStorage만 사용 |
| RN 호환성 | 경고 가능성 | 가장 안전함 |
최종 권장 코드
import * as amplitude from "@amplitude/analytics-react-native";
export const initAmplitude = async (apiKey: string) => {
if (!apiKey) {
console.warn("Amplitude API key missing");
return;
}
await amplitude.init(apiKey, undefined, {
disableCookies: true,
trackingOptions: {
deviceId: true,
sessionId: true,
platform: true,
},
}).promise;
};
마무리
React Native에서 Amplitude를 쓴다면 disableCookies: true는 선택이 아닌 필수 설정입니다.
브라우저가 아닌 환경에서 브라우저 API를 시도하는 게 문제의 본질이니, 아예 그 경로를 차단하는 게 정답입니다. 이 한 줄로 콘솔은 깔끔하게, Amplitude는 안정적으로 돌아갑니다.
![[FE] 새로고침 해도 이미지를 유지하는 방법](https://velog.velcdn.com/images/suadesu/post/d75099ba-9c10-45a1-9714-27e778598969/image.jpg)
![[항해플러스] 최종 회고](https://velog.velcdn.com/images/suadesu/post/2d89266f-dc6a-43c9-a491-1996be5f2c2a/image.png)