
웹 애플리케이션에서 로그인 시스템을 효과적으로 구현하는 것은 사용자 경험과 보안 모두를 보장하는 데 중요합니다. 이 튜토리얼에서는 Apollo Client를 사용하여 React 애플리케이션에서 사용자 인증을 처리하는 방법을 보여주며, 데이터 처리에는 GraphQL을 활용합니다.
로그인 기능은 GraphQL 뮤테이션을 통해 구동됩니다. 해당 뮤테이션은 다음과 같이 정의됩니다:
mutation login($loginInput: LoginInput!) {
login(input: $loginInput) {
ok
token
error
}
}
이 뮤테이션은 사용자의 이메일과 비밀번호를 포함하는 LoginInput 타입을 받고, 로그인이 성공하면 ok, token, 실패하면 error 메시지를 반환합니다.
react-hook-form을 사용하여 폼 상태와 검증을 관리합니다:
import { useForm } from "react-hook-form";
const { register, handleSubmit, getValues, formState: { errors, isValid } } = useForm({
mode: "onChange",
});
const onSubmit = () => {
const { email, password } = getValues();
loginMutation({
variables: {
loginInput: {
email,
password,
},
},
});
};
폼 필드는 register를 통해 관리되며, 폼 제출은 handleSubmit이 처리하며 onSubmit 함수를 트리거합니다.
Apollo Client의 useMutation 훅을 사용하여 로그인 뮤테이션을 처리합니다:
const [loginMutation, { data: loginMutationResult, loading }] = useMutation<LoginMutation, LoginMutationVariables>(LOGIN_MUTATION, {
onCompleted,
});
const onCompleted = (data: LoginMutation) => {
const { login: { ok, token } } = data;
if (ok && token) {
localStorage.setItem(LOCALSTORAGE_TOKEN, token);
authTokenVar(token);
isLoggedInVar(true);
}
};
onCompleted는 뮤테이션이 완료될 때 트리거되며 토큰 저장과 상태 업데이트를 처리합니다.
HTTP 헤더를 관리하기 위해 createHttpLink와 setContext를 Apollo Client 설정에 포함합니다:
const httpLink = createHttpLink({ uri: "http://localhost:4000/graphql" });
const authLink = setContext((_, { headers }) => ({
headers: {
...headers,
"x-jwt": authTokenVar() || "",
},
}));
const client = new ApolloClient({
link: authLink.concat(httpLink),
cache: new InMemoryCache(),
});
이 설정은 사용 가능한 경우 모든 GraphQL 요청에 JWT를 포함하도록 보장합니다.
애플리케이션이 구독을 사용하는 경우, 비슷한 토큰 기반 인증으로 보안을 강화합니다:
const wsLink = new GraphQLWsLink(createClient({
url: "ws://localhost:
4000/graphql",
connectionParams: {
"x-jwt": authTokenVar() || "",
},
}));
이 설정은 WebSocket 연결에 대한 연결 매개변수의 일부로 JWT 토큰을 전달합니다.
Apollo Client와 React를 사용하여 GraphQL을 통해 사용자 인증을 효율적으로 관리할 수 있습니다. 이 설정은 사용자 경험을 원활하게 하고, 중요 데이터를 올바르게 처리함으로써 보안 표준을 유지합니다.