[graphQL] graphQL middleware

seokki kwon·2022년 9월 7일
0

graphql-middleware 기반 쿼리접근 제한

설치

npm install graphql-middleware graphql-shield

applyMiddleware

import ...

const PORT = process.env.PORT;
const executableSchema = makeExecutableSchema({ typeDefs, resolvers });
const schemaWithMiddleware = applyMiddleware(executableSchema, permissions);
const apollo = new ApolloServer({
  typeDefs,
  resolvers,
  playground: false,
  schema: schemaWithMiddleware,

보안상 미들웨어 추가부분만 업로드
applyMiddleware 부분에 스키마와 미들웨어를 추가
graphql-shield 를 사용하기에 규칙을 정의한 permissions 객체를 불러와서 추가

rules

import { allow, deny, rule, shield } from "graphql-shield";


const isAuthenticated = rule()(async (parent, args, ctx, info) => {
  // 유저인증 로직
});

export const permissions = shield({
  // 쿼리
  Query: {
     "*": allow, // 모든요청 불허용
    //   users: and(isAuthenticated, isAdmin),
    //   me: isAuthenticated,
  },
  // 뮤테이션
  Mutation: {
    "*": allow, // 인증시 업데이트 가능
    //   createUser: isNotAlreadyRegistered,
  },
});

보안상 공식문서 예제를 사용
permissions 에 규칙정의
isAuthenticated 에 유저 로직을 작성

동작원리

graphql-middleware 는 실제 해석기(resolver) 호출전,후 에
미들웨어 함수를 실행시켜줌

현재는 쿼리에 무분별한 접근을 막는것이 목적이라고 생각하며
실제로 미들웨어를 작성하기보다 체계적으로 규칙을 정의하여 권한계층을 만드는
graphql-middleware 기반의 graphql-shield 라이브러리를 적용

error

const executableSchema = makeExecutableSchema({ typeDefs, resolvers });

정확히 이부분에서 Did you mean Upload or Float? 이러한 오류가나서

분명히 typeDefs 는 DocmentNode 라는 형식으로 들어가 있는데
계속 문제가 발생함 원인은 typeDefs의 upload 라는 type 이 들어가있었고
해석기가 해당타입을 인식하지 못한 문제같음.

보안해야될 사항

  • 실제 브런치에 올려서 확인
  • 토큰 검증부분에 대한 로직을 보완
  • 정확한 테스트 진행
profile
웹 & 앱개발 기록

0개의 댓글