[TIL]Apollo Server Context

영태·2022년 4월 7일
0

[TIL]

목록 보기
18/21
post-thumbnail

Context

apollo server의 resolver에서 전역적으로 사용가능한 변수

ApolloServer를 만들때 context는 커스텀 미들웨어를 전달하는 역할을 한다.

const createApolloServer = (): ApolloServer => new ApolloServer({
  typeDefs: importSchema('schemas/schema.graphql'),
  context: ({ req }): {
    getUser: () => Promise<User>;
    models: ModelType;
    pubsub: PubSub;
    appSecret: string;
    ========이하 생략==============
  } => ...

다음 예문에서

getUser: () => Promise<User>;
models: ModelType;
pubsub: PubSub;
appSecret: string;

getUser 는 사용자가 로그인 했을 때 resolver 에서 인증하기 위해 사용한다.
models 은 Sequelize 에서 가져온 것으로 실제 데이터베이스의 CRUD를 수행한다.
pubsub 은 websocket 을 사용하는 graphql-subscription 을 위한 것이다.
appSecret 은 자신의 JWT secret 이다.

대략 이렇게 user가 서버에 접속하려 할 때 관련절차를 적는 것이라 할 수 있다.

컨텍스트 레벨 인증은 GraphQL 서버에서 구현할수 있는 가장 단순하지만 가장 안전한 인증이다.

클라이언트에서 인증 토큰이 넘어오지 않거나, 넘어온 토큰이 유효하지 않은 경우에는 요청을 무조건 차단하는 것이다.

컨텍스트 레벨 인증을 할 때,
ApolloServer 생성자의 context옵션에 인증관련 함수를 할당해줘야 한다. context 옵션에 할당된 함수는 모든 요청에 대해 호출되고 요청 정보를 인자로 받기 때문에

이 context라는 부분은 인증 토큰을 검증하는 적합하다.


다음과 같이 설정한 context에서 이루어지는 인증절차는 이렇다.

  1. req.headers.authorization을 통해 토큰 존재 여부를 체크한다. 헤더값이 없다면 AuthorizationError을 던진다.
  2. 이 인증 토큰에 매칭되는 사용자가 있는지 users 배열을 검색한다.
  3. 사용자가 없다면 역시 에러를 던진다.
    사용자가 존재한다면 사용자 정보를 컨텍스트에 세팅하여 추후 resolver에 접근할 수 있도록 해준다.

마무리

사실 서버관련해서는 아직 제대로 배우지 못했다.
아폴로서버를 제대로 공부한 후 추가 포스팅 예정...

Reference

GraphQL 서버의 사용자 인증/인가 (Apollo Server Authentication/Authorization)
[GraphQL] apollo server에 context 추가하기
Apollo Server로 GraphQL API 서버 개발하기 (3)

profile
개발 공부중

0개의 댓글