Mo-Gak-Ko > API 서버 포스트맨 접근 제한

jhj46456·2020년 5월 22일
0

Mo-Gak-Ko

목록 보기
3/18

문제

모각코웹을 만들면서 API 보안에 큰 구멍이 뚫렸다.

GraphQL API의 경우 Query / Mutation을 클라이언트에서 원하는 만큼 가져다 쓸 수 있는 장점이 있지만,
지금 작업하고 있는 사이드 프로젝트에는 문제가 발생했다.

여기와 이어지는 내용임.

프론트에서 URL을 통한 무단 접근은 막았지만 Postman으로 API를 호출하면 다 나와버린다 -0- (CORS 설정했는데도)
Production 환경에서 playground해제 해주면 될 줄 알았는데 아니었다.

필자의 API 목록에는 똑같이 [Room]! 을 return 하는 것들이 3개나 있다.

  1. roomPublic
  2. roomPrivate
  3. searchRoom

그리고 Room 은 다음과 같다.

빨강 브러쉬 표시는 모임의 구성원만 접근 가능한 필드여야함.

Room >> participants와 pendings에 대한 Resolver는 다음과 같다.

Room: {
  participants: ({ id }, __, { prisma }) =>
    prisma.participant.findMany({ where: { roomId: id } }),
  pendings: ({ id }, __, { prisma }) =>
    prisma.pending.findMany({ where: { roomId: id } }),
  ...
}
  

이 상태에서 Postman으로 쿼리를 날려보면 roomPublic 임에 불구하고 접근 제한 data를 가져옵니다.


해결

DB조회하는 부분은 현재 사용중인 Prisma2 ORM 이 담당하기에 공식 문서를 눈 빠지게 읽어보았다.

그 결과 Prisma Client - Filteringincludeselect를 적절하게 활용하면 해결할 수 있다는 결론에 도달했다.

일단 기존에 각각 호출하던 Room >> participantspendings는 지워주고

roomPublic변경하였다.

변경 전

변경 후

이제 포스트맨으로 다시 쿼리를 보내보면 roomPublic으로 contactURL과 participants, pendings를 볼 수 없다.

roomPublic(roomId: ~) {
	contactURL
}

roomPublic(roomId: ~) {
	pendings {
		...
	}
}

roomPublic(roomId: ~) {
	participants {
		...
	}
}

마지막

마지막으로 roomPrivate도 변경해줘야 하는데, 방법이 조금 다르다.

roomPublic은 모두가 볼 수 있는 data만 select 해줬다면
roomPrivate은 Room - Resolver에서 두 항목을 제거 하였으므로 없어진 data를 include 해줘야 한다.

roomPrivate(roomId: ~) {
  participants {
    ...
  }
  pendings {
    ...
  }
  contactURL
}

위처럼 조회하기 위해 include를 해야함

그 방법은 다음과 같습니다.

프론트의 URL 직접 접근도 막아야 하고, 백엔드직접 접근하는 경우도 막아야 합니다.

profile
리액뚜

0개의 댓글