개발자
Next.js에서 클라이언트 컴포넌트에 사용하는 환경 변수에 NEXT_PUBLIC을 붙여줘야하는 것으로 압니다. 제가 프로젝트에서 api 키를 포함해 클라이언트 컴포넌트에서 fetch 요청을 보내야하는 상황이라(리액트 쿼리 사용 중), 해당 api키에 위와 같은 변수를 붙여주었습니다. 그런데 해당 방법이 안전한걸까요? 전에 chatGPT에서는 NEXT_PUBLIC을 붙이는 환경 변수에는 api 키와 같은 보안에 중요한 변수는 넣지 않는게 좋다고 하더라고요.... 이 말이 사실인건가요? 그렇다면 그 이유가 궁금합니다.. + Next.js에서 리액트 쿼리를 사용하고 있는데 리액트 쿼리를 사용하는 곳은 클라이언트 컴포넌트여야 정상적으로 작동하더라고요.. 만약 api 키가 포함된 요청을 클라이언트 컴포넌트에서 사용하는 것이 보안에 좋지 않다면, 어떤 방법을 써서 api 요청을 보내야할까요? Next.js의 api 라우트를 만들어 요청하는게 맞는건가요? 개발에 대해 잘 몰라 질문이 깔끔하지 않습니다만.. 혹시 아는 분 계시면 도와주세요 😭❕
답변 2
클라이언트 컴포넌트는 사용자(브라우저)에 직접 노출됩니다. 사람의 실수로 중요한 정보가 노출될 가능성이 있으므로 권장하지 않는겁니다. Nextjs 버전 14(app router)에서 권장하는 방식은 다음과 같습니다. 데이터 패칭(GET)은 서버 컴포넌트에서 async, await를 통해 진행하세요. 그 외 요청(POST, PUT, DELETE 등)은 API 라우트를 사용하시면 좋습니다.
olcloolzj
작성자
대학생 • 2024년 05월 28일
답변 감사합니다 ! 제가 리액트 쿼리를 사용 중인데 리액트 쿼리는 클라이언트 컴포넌트에서만 사용 가능하더라구요 ,,(?) 그럼 리액트 쿼리로(클라이언트 컴포넌트에서) api 요청을 바로 보내는게 아니라 api 라우트를 이용해 api 요청을 해주는 로직을 만들어도 되는걸까요? 클라이언트 컴포넌트 ↔️ api 라우트를 이용해 만든 로직(여기에 실제 api 키는 NEXT_PUBLIC이 붙지 않는 서버 환경 변수로 저장) ↔️ 실제 api 이런 구조 요청하고 응답을 전달받도록 수정했는데 이렇게 변경해도 되나요? 😶,,
포크코딩
별빛상단 단주 • 2024년 05월 28일
next 공식 문서에서 제공하는 프로덕션 룰들을 지키면 대부분 문제 없습니다!
olcloolzj
작성자
대학생 • 2024년 05월 28일
친절하게 답변해주셔서 감사해요 ㅎㅎ !! 하루 마무리 잘하세요 정말 감사합니다 🙂👍✨
NEXT_PUBLIC 으로 절대 외부 api key나 api secret을 정의하시면 안됩니다. api router로 한 번 proxy를 만들어주세요. Client => Api Router => 외부 API Api Router에서는 process.env로 환경변수 접근이 가능합니다.
E2E
• 2024년 05월 29일
안녕하세요 api router를 쓰라고 말씀해주셨는데 use server로 디비에 직접 붙는건 별로인걸까요?
olcloolzj
작성자
대학생 • 2024년 05월 29일
답변 감사합니다 ㅎㅎ! 조언해주신 방식대로 수정하였습니다 🙂🙂 !!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 05월 27일
Next.js에서는 "NEXT_PUBLIC_" 접두사가 붙은 환경 변수를 클라이언트 측 JavaScript로 전송하므로, 이는 사용자의 브라우저에 노출될 수 있습니다. 이는 공개적으로 공유할 정보를 저장하기 위한 것이며, API 키와 같은 민감한 정보를 저장할 수 있는 안전한 방법이 아닙니다. API 키와 같은 보안에 중요한 데이터를 사용해야 할 경우 Next.js의 서버사이드 기능을 최대한 활용하는 것이 좋습니다. 예시로는 getServerSideProps, getInitialProps, API 라우트 등 서버에서만 동작하는 기능들이 있습니다. 예를 들어, Next.js API 라우트를 사용하면 필요한 데이터를 백엔드에서 가져오고 프론트엔드로 보내줄 수 있습니다. 이렇게 해서 클라이언트 쪽 코드에서 직접 API 요청을 하지 않아도 되며, API 키 등의 보안정보가 외부에 노출되는 것을 막을 수 있습니다. 더 나아가서, 해당 요청을 처리하는 함수 내부에서 리액트 쿼리나 다른 클라이언트 상태 관리 도구를 사용하여 결과를 저장하고 재활용할 수 있습니다. 최종적으로, 필요한 데이터 접근 방법과 보안 요구사항을 먼저 판단하고, 그에 따라 적절한 Next.js 기능을 사용하는 것이 중요합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!