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)