Sharryhong's Front-End
  • About Sharryhong's Front-End Blog.
  • Front-End Dev
    • Flutter
      • API Key 안전하게 숨기기. Cloudflare Workers!
      • Web CORS 에러
    • Vue.js
      • usePagination - composition api (vue2)
      • Pagination Component
      • Vue Image Skeleton
      • Sort an Array of Objects by Boolean property
      • Dynamic Components
      • LoadingBar Component
      • composition-api 사용하여 menu 의 outside click 시 close
      • vue+TypeScript
      • Vue.js 개발자를 위한 VS Code
      • Vue3 Chrome Extension
      • input file 선택된 파일 명 reset하기
      • element 내부 scroll 될 때, ScrollTop 값에 따라 div를 보이게, 안보이게 제어하기
      • 진입한 url path에 맞게 메서드 실행
    • React
      • 절대경로(absolute path) 설정, jsx파일로 이동 설정
      • useContext rerender issue
      • Firebase v9 Auth with React
      • Firebase v9 Realtime Database with React
      • React Star Rating (별점 표시)
      • React App deploying (배포)
    • Next.js
      • CSR, SSR, Next.js
    • API Mocking
      • Vue 에서 msw 적용하기
    • Storybook
      • styled-component theme.ts가 storybook엔 적용안되는 이슈
      • storybook에서 alias path 안되는 이슈
      • storybook에 Global Style 적용하기
  • etc
    • brew update
    • npm upgrade (mac)
  • DEV BETTER
    • Clean Code
      • Clean Code JavaScript 강의
        • Variables - 변수 다루기
        • Boundary - 경계 다루기
        • Conditional - 분기 다루기
        • Array - 배열 다루기
      • Tip. 클린 코드를 위한 5가지 팁
      • Tip. 코딩 잘하는 팁 3가지
    • 웹 성능 최적화 (performance)
      • performance 강의
        • loading, rendering performance
        • Tools
        • Image size optimization
        • bottleneck (병목) code 탐색
Powered by GitBook
On this page
  • 이슈
  • 해결 방법

Was this helpful?

  1. Front-End Dev
  2. Flutter

API Key 안전하게 숨기기. Cloudflare Workers!

2023-06-28

PreviousFlutterNextWeb CORS 에러

Last updated 1 year ago

Was this helpful?

이슈

현재 서드파티 API로 Youtube Data API를 사용중입니다.

api호출시 key가 네트워크에 노출되고 있었는데요, Cloudflare Workers 서비스로 기존코드를 거의 수정할 필요 없이, 거의 무료로 사용할 수 있다는걸 알게되었습니다.

해결 방법

자료에 링크해놓은 니콜라스 유튜브를 참고하여

  1. Cloudflare Workers 계정만들기

  2. 설치 npm install -g wrangler

  3. 로그인 wrangler login

  4. 프로젝트에 keys 폴더 생성 wrangler init keys -y

  5. keys 폴더로 이동 후 dev시 사용할 url 얻기 wrangler dev

  6. 배포후 사용할 url 얻기 wrangler deploy

  7. 실제 api 요청해보기

현재 플러터에서 api관련 코드는 lib/services/api_service.dart에서 관리중입니다.

...
class ApiService {

  static const String baseUrl = kReleaseMode
      ? "https://.." // wrangler deploy시 나온 url 
      : "http://.."; // wrangler dev시 나온 url 
      
  ...

  static Future<List<SearchItemModel>> getSearchItems(String text,
      [int? max]) async {
    ...
    final url = Uri.parse(
        '$baseUrl/search?part=snippet&maxResults=$maxResults&q=$text&type=video');
 
    final response = await http.get(url);

    if (response.statusCode == 200) {
      return ...;
    }
  • 기존 코드에서 수정한 부분은 baseUrl부분, 그리고 Uri.parse에서 api key 부분을 삭제한 것 뿐입니다.

  • 즉, 서드파티 api 로 직접 호출하지 않고 Cloudflare Workers 를 거쳐서 호출하게 됩니다.

위 4번에서 keys폴더 내에 생성된 worker.ts파일

...
export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
    const baseUrl = '서드파티 url';
    const apiKey = 'apiKey';

    const { pathname, searchParams } = new URL(request.url);

    const relayUrl = `${baseUrl}${pathname}?key=${apiKey}&${searchParams.toString()}`;
    const response = await fetch(relayUrl);

    const json = await response.json();
    const jsonString = JSON.stringify(json);

    return new Response(jsonString, {
      status: response.status, 
      headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
      },
    });
  },
};
  • status: response.status // ApiService에서 response.statusCode 를 사용할 수 있습니다.

  • charset=utf-8 // 한국어가 깨지지 않습니다.

자료

https://workers.cloudflare.com/
땡큐 니콜라스!