[TIL]Apollo Server Context
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에서 이루어지는 인증절차는 이렇다.
req.headers.authorization
을 통해 토큰 존재 여부를 체크한다. 헤더값이 없다면 AuthorizationError을 던진다.- 이 인증 토큰에 매칭되는 사용자가 있는지
users
배열을 검색한다. - 사용자가 없다면 역시 에러를 던진다.
사용자가 존재한다면 사용자 정보를 컨텍스트에 세팅하여 추후resolver
에 접근할 수 있도록 해준다.
마무리
사실 서버관련해서는 아직 제대로 배우지 못했다.
아폴로서버를 제대로 공부한 후 추가 포스팅 예정...
Reference
GraphQL 서버의 사용자 인증/인가 (Apollo Server Authentication/Authorization)
[GraphQL] apollo server에 context 추가하기
Apollo Server로 GraphQL API 서버 개발하기 (3)
Author And Source
이 문제에 관하여([TIL]Apollo Server Context), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leo3179/TILApollo-Server-Context저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)