소셜라이트 설치 후 테스트 하던 중 오류 발생
Laravel\Socialite\Two\InvalidStateException
http://localhost:8000/auth/callback?code=3f6b82ac26631b86ec2f&
state=v5jhUGeF6v6jvp8MmqJJ1I6KducyLYTfRAqxWmAL
Laravel\Socialite\Two\InvalidStateException 오류는
Socialite 패키지에서 상태(state) 값이 일치하지 않을 때 발생합니다.
일반적으로 OAuth 흐름에서 상태 값은 보안을 강화하기 위해 사용되며,
인증 요청 시에 생성되고 응답에서 확인됩니다.
예전에 비슷한 문제가 콜백 url을 다르게 설정했었어서 이번에도 그 문젠가 싶었는데, 아니었다.
chat GPT가 제시한 해결책은 아래 5가지였는데, 이 중에 세션문제였다.
쿠키 문제:
Socialite는 상태 값을 세션 또는 쿠키에 저장하여 유지합니다. 만약 브라우저에서 쿠키를 차단하거나, 쿠키가 올바르게 설정되지 않았다면 이러한 문제가 발생할 수 있습니다. 브라우저 쿠키 설정을 확인하고, 쿠키가 올바르게 전송되고 있는지 확인하세요.
세션 문제:
Laravel은 세션을 사용하여 상태 값을 저장합니다. 세션을 사용하므로, 만약 서버 측에서 세션 설정이 문제가 있다면 이런 오류가 발생할 수 있습니다. 세션에 대한 설정이나 구성을 확인하세요.
Redirect URI 확인:
OAuth 공급자(예: Google, Facebook)에 등록된 리디렉션 URI가 올바른지 확인하세요. Socialite 구성에서 등록한 리디렉션 URI와 OAuth 공급자에 등록한 URI가 일치해야 합니다.
CSRF 토큰 확인:
CSRF(Cross-Site Request Forgery) 토큰이 올바르게 생성되고 전송되었는지 확인하세요. Socialite는 상태 값을 생성할 때 CSRF 토큰도 함께 생성합니다. CSRF 토큰이 누락되면 상태 값이 일치하지 않는 오류가 발생할 수 있습니다.
세션 유지:
사용자가 OAuth 플로우 동안 로그아웃되거나 세션이 만료되면 상태 값이 더 이상 유효하지 않게 됩니다. 사용자의 세션 상태를 확인하세요.
결과적으로 말하면, .env에서 세션설정이 SESSION_DRIVER=database로 되어있었는데, 이를 SESSION_DRIVER=file으로 변경 후, 설정 적용을 위해 php artisan config:cache 와php artisan config:clear 로 캐시 클리어하니 오류 해결되었다.
일단 해결은 했지만 세션 저장소가 db인데 왜 오류가 상태(state) 값이 일치하지 않는다고 뜨는지 해결되지 않았다. 포스팅 해두고 나중에 다시 보자
이 방법은 최종 해결방안(세션을 기록하지 않기)을 통해 다시 보니 db설정문제가 아니라 캐시를 지워서 해결된 케이스인듯 하다.
캐시를 삭제 후 시크릿 모드에서 테스트하니 정상작동한다.
php artisan config:cache
php artisan cache:clear
이후 동일한 오류가 날 때 위 처럼 캐시를 지우는 것으로 해결했으나,
이렇게 해도 오류가 안없어져서 아래처럼 세션을 유지하지 않는 것으로 바꾸니 해결되었다.
$user = Socialite::driver('google')->stateless()->user();
추가적으로 일반적으로 웹 애플리케이션에서는 user()를 사용하고, API 서비스에서는 stateless()->user()를 사용하는 것이 일반적이라고 한다.
웹 애플리케이션에서는 세션을 사용하여 사용자를 관리하고, API 서비스에서는 세션을 사용하지 않고 토큰을 사용하여 인증하기 때문이란다.
이후 소셜라이트에서 OAuth 연결을 하는 경우 토큰을 사용하는지 확인해봐야겠다.