목록2026/01 (6)
eatthefrog
웹/앱 서비스를 개발하다 보면 인증(Authentication) 단계에서 늘 마주치는 주제가 있습니다. 바로 Token입니다. 단순히 token 하나만 쓰면 편할 것 같은데, 왜 굳이 refreshToken까지 챙겨야 할까요?1. 왜 그냥 token 말고 refreshToken을 넣어야 하나요?이건 마치 **'놀이공원 자유이용권'**과 **'신분증'**의 관계와 같습니다.Access Token (자유이용권): 놀이기구(서버 데이터)를 탈 때마다 보여줘야 합니다. 하지만 분실하면 누구나 이용할 수 있어 위험하죠. 그래서 유통기한을 아주 짧게(예: 1시간) 설정합니다.Refresh Token (신분증): 자유이용권이 만료되었을 때, 매표소(서버)에 가서 "제 신분증 여기 있으니 자유이용권 새로 끊어주세요!"..
GraphQL의 가장 큰 장점은 클라이언트가 원하는 데이터를 깊게(Nested) 파고들며 한 번에 가져올 수 있다는 것입니다. 하지만 이 장점은 양날의 검과 같습니다. 특히 배열을 반환하는 중첩 필드에서 페이징이 빠져 있다면, 이는 서버를 마비시킬 수 있는 '데이터 폭탄'이 됩니다. 1. 문제의 발단: "뒷문이 열려 있다"보통 우리는 getItems(limit: 10)와 같은 탑레벨(Top-level) 쿼리에는 페이징을 엄격히 적용합니다. 하지만 다음과 같은 중첩 쿼리는 어떨까요?query AttackQuery { getClass { id students { # ⚠️ 여기서 페이징이 없다면? id name } }}만약 특정 사용자가 3년간 기록한 2,00..
1. 쿼리 깊이 제한 (Query Depth Limit)원리: "무한 루프의 사슬을 끊기"GraphQL은 그래프 구조이므로 서로 연결된 데이터를 타고 계속 들어갈 수 있습니다. 쿼리 깊이 제한은 요청된 쿼리가 최대 몇단계까지 중첩되었는지를 계산하여 일정 수준이 넘으면 실행전 차단하는 방식이다.공격 시나리오: 사용자(User)와 친구(Frined)가 서로 연결된 스키마에서 공격자가 다음과 같은 쿼리를 보낸다.query DoS { user(id: "1") { friends { friends { friends { # ... 이 과정을 수백 번 반복 ... } } } }} 쿼리 깊이 제한 필요성1. 메모리 고갈 방지: 서버는 이 쿼..
https://www.reddit.com/r/graphql/comments/cdzyxl/playground_wont_stop_requesting_data/?tl=ko Reddit의 graphql 커뮤니티graphql 커뮤니티에서 이 게시물을 비롯한 다양한 콘텐츠를 살펴보세요www.reddit.com분명히 요청을 몇 번 보내지도 않았는데 서버에서 429 Too Many Requests 에러가 발생했습니다. 이는 주로 Apollo Sandbox나 GraphQL Playground 같은 도구의 기본 설정 때문에 발생합니다.이 현상의 핵심인 Introspection과 Schema Polling을 파헤쳐보고, 보안과 자원 효율성을 모두 챙기는 방법을 알아보겠습니다.1. Introspection: GraphQL의 ..
최근 프로젝트에서 Apollo Client를 v4로 업그레이드하며 발생한 Namespace '...' has no exported member 에러와, 이를 해결하기 위해 아키텍처를 현대화한 과정을 공유합니다. 1. 문제의 본질: Apollo v4의 구조 변화와 "세대 차이"가장 먼저 마주한 문제는 기존의 **레거시 코드 생성 방식(Legacy Codegen)**이 Apollo Client v4의 변화된 타입 시스템을 인지하지 못한다는 점이었습니다.Internalization (타입의 내재화): Apollo v4는 패키지 경량화를 위해 기존에 최상위(Root)에서 Export하던 MutationFunction, QueryResult 같은 타입들을 useMutation.Options, useQuery.Da..
개발 과정에서 클라이언트는 분명히 데이터를 보냈고, 서버 로그에도 찍히는데, GraphQL 엔진은 "필수 변수가 제공되지 않았다"며 요청을 거부하는 이해할 수 없는 에러를 만났습니다. 1. 문제의 발단 : "Variable $name was not provided"회원가입 API호출 시 다음과 같은 에러가 발생했습니다. [ERROR] GraphQL Validation Errors: { "errors": [ { "message": "Variable \"$name\" of required type \"String!\" was not provided." } ], "variables": { "name": "홍길동" }}모순적인 상황: 로그 하단의 variables 객체에는 nic..