AWS CF Function 과 정책을 활용한 접속 국가별 Redirect 처리

2025. 4. 26. 10:34·Frontend/Article
728x90

 

1. 환경

- React 앱을 AWS s3+cf로 배포

- 사용자의 실제 접속 국가에 따른 루트 경로에서의 URL 리다이렉트 처리가 필요한 상황

ex) 한국에서 접속한 사용자는 /domain/kr, 독일에서 접속한 사용자는 /domain/eu 형태로 리다이렉트 되어야 함

 

 

2. 방법 

1. AWS 정책 추가

https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/adding-cloudfront-headers.html

 

CloudFront 요청 헤더 추가 - Amazon CloudFront

CloudFront가 최종 사용자의 요청에서 원본 또는 엣지 기능으로 특정 HTTP 헤더를 추가하도록 CloudFront를 구성할 수 있습니다. 이러한 HTTP 헤더의 값은 최종 사용자 또는 최종 사용자 요청의 특성을

docs.aws.amazon.com

사용자의 접속 국가를 알기 위해서는 해당 정보를 받을 수 있게 정책 추가가 필요하다.

국가 정보를 넘겨주는 헤더는 "CloudFront-Viewer-Country" 다

  • CloudFront-Viewer-Country – 최종 사용자 국가의 두 자로 된 국가 코드가 들어 있습니다. 국가 코드 목록은 ISO 3166-1 alpha-2 단원을 참조하세요.

++ 해당 헤더 말고도 region 이나 위도/경도, 디바이스 유형 정보를 받을 수 있는 헤더가 존재한다.

 

1) CloundFront > 정책 > 캐시 

 

 

2) 캐시 정책 생성

이름과 설명은 자유롭게 적어주면 되고, 캐시 키 설정 > 헤더 > 다음 헤더 포함 으로 "CloudFront-Viewer-Country" 를 추가해준다.

 

참고)

정책에는 3가지 종류가 있는데 (캐시, 원본 요청, 응답 헤더)

  • 캐시 정책
    • 캐시 정책은 CloudFront 엣지 로케이션에 저장되는 객체의 캐시 키를 정의 함
    • 사용자의 요청의 캐시 키가 엣지 로케이션이 저장된 캐시 키라면 캐시된 값을 응답 함
  • 원본 요청 정책
    • CloudFront가 오리진 서버(원본)에 요청을 보낼 때 어떤 데이터를 포함할 지 제어
    • 캐시 정책에서 지정한 값은 자동으로 오리진 요청에 포함됨 !
    • 따라서 캐시 키에는 포함되지 않고 오로지 오리진 요청에 꼭 포함되는 값일 때만 원본 요청 정책을 사용
  • 응답 헤더
    • CloundFront가 최종 사용자에게 응답을 보낼 때 Http 응답 헤더를 추가하거나 제어 하는 역할
    • 보통 Cors처리나 보안 처리를 위해 헤더 세팅을 할 때 해당 부분에 정책을 추가함

>>> 캐시 키 정책에 추가한 이유는 사용자의 IP에 따라 국가 정보를 캐시 키로 추가 함으로서 오리진 서버 부하를 줄이기 위함

 

2. CF function 추가

* 필자는 Cf function을 이용해서 리다이렉트 처리를 구현 하였는데, 국가 정보를 응답헤더에서 추가한 후 코드 레벨에서 처리 하는 것도 가능 하다.

 

1) CloundFront > 함수 > 함수 생성

이름은 자유롭게 지정

 

2) 함수 선언

AWS에 친절한 예시가 있다.

https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/example_cloudfront_functions_redirect_based_on_country_section.html

 

CloudFront Functions 뷰어 요청 이벤트에서 새 URL로 리디렉션 - Amazon CloudFront

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

ES6 문법을 쓰지 않은건 살짝 아쉽지만 그대로 함수 코드로 복붙

 

해당 코드를 설명하면, country가 DE(독일)인 경우에 대해 /de/index.html 로 리다이렉트 되도록 처리된 부분이다.

테스트를 위해서 country는 KR로 바꿔두고 저장.

 

3) 배포 > 동작에서 추가한 정책과 Cf function을 연결

필자는 Root Path에서의 국가별 리다이렉트 처리가 필요해 /index.html 경로에 대해 새 동작을 추가했다. 

 

캐시 키 및 원본 요청에서 아까 추가한 캐시 정책을 연결해주고,

 

 

함수 연결에서 만들어 둔 Cf function을 뷰어 요청에 추가 한다. 

 

* 뷰어 요청, 뷰어 응답, 원본 요청, 원본 응답에 대한 차이는 아래 참고.

종류 트리거 시점  캐시 주 용도
뷰어 요청 뷰어가 CloudFront에 요청 보낼 때 캐시와 무관 인증, 리다이렉트, 캐시 키 변경
뷰어 응답 CloudFront가 뷰어에게 응답 보내기 직전 항상 보안 헤더, 쿠키, 최종 응답 가공
원본 요청 캐시 미스 시, 오리진으로 요청 전달 전 캐시 미스 시만 오리진 선택, 요청 가공
원본 응답 오리진에서 응답 받았을 때, 캐시에 저장 전 캐시 미스 시만 응답 가공, 헤더 추가/변경

 

 

3. 테스트

위 과정을 거친 후 배포된 페이지에서 Cf function로 동작하는지 테스트 해보면 된다.

아마 잘 될 것! ㅎ.ㅎ

 

 

 

++ 추가

필자는 정책을 추가했음에도 Cf function 에서 해당 헤더를 받지 못하는 이슈가 있었는데

Cf 배포의 기본 루트 객체를 index.html로 설정을 해두고, 동작에서 "/" 에 대해서만 캐시 정책과 cf function을 추가 했었던 상황

 

요렇게 되면 "/"에 대한 요청은 "/index.html"로 사용자에게 응답하게 되는데, 해당 요청을 더 우선 시 하기 때문에 "/" 경로에 추가한 캐시정책과 Cf function이 동작하지 않는 것 처럼 보였음

 

따라서 동작을 "/" 경로가 아닌 "/index.html" 에 대해 추가하도록 해서 해결함

관련 글

https://repost.aws/questions/QUYGawRXotQhWZ184QJDOBqA/root-path-pattern

 

Root Path Pattern

How can I create a pattern only for the default page i.e. https://example.com or https://example.com/ I created a path pattern / But everytime it just falls through to the default bucket. Wh...

repost.aws

 

 

 

 

 

728x90
저작자표시 비영리 (새창열림)

'Frontend > Article' 카테고리의 다른 글

딥링크(Deep Link)에 관하여 (Feat: URL Scheme, App Link, Universal Link)  (0) 2024.12.01
CRA없이 React, Ts, Webpack 개발 환경 구축(+ eslint, prettier)  (1) 2024.06.06
모바일 앱(App)과 웹뷰(WebView)의 통신에 관하여 (Feat. JavaScriptInterface)  (2) 2024.04.27
Rollup을 이용하여 컴포넌트 라이브러리 만들기 ! (React, Ts, Sass, Storybook)  (5) 2023.11.26
rollup-plugin-postcss의 SASS 파일 내 custom alias 처리 문제  (0) 2023.10.14
'Frontend/Article' 카테고리의 다른 글
  • 딥링크(Deep Link)에 관하여 (Feat: URL Scheme, App Link, Universal Link)
  • CRA없이 React, Ts, Webpack 개발 환경 구축(+ eslint, prettier)
  • 모바일 앱(App)과 웹뷰(WebView)의 통신에 관하여 (Feat. JavaScriptInterface)
  • Rollup을 이용하여 컴포넌트 라이브러리 만들기 ! (React, Ts, Sass, Storybook)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    데브코스
    react
    Algorithm
    C++
    리팩토링
    백준
    파일처리
    프로그래머스
    lisp
    자료구조
  • hELLO· Designed By정상우.v4.10.2
BeNI
AWS CF Function 과 정책을 활용한 접속 국가별 Redirect 처리
상단으로

티스토리툴바