Google 로그인에서 이전

이 가이드에서는 인증을 위해 자바스크립트 라이브러리를 이전 Google 로그인 플랫폼 라이브러리에서 최신 Google ID 서비스 라이브러리로 이전하는 데 필요한 변경사항과 단계를 설명합니다.

클라이언트가 자바스크립트용 Google API 클라이언트 라이브러리 또는 승인을 위한 이전 라이브러리를 사용하는 경우 자세한 내용은 Google ID 서비스로 이전을 참조하세요.

인증 및 승인

인증은 사용자를 식별하고 일반적으로 사용자 가입 또는 로그인이라고 합니다. 승인은 데이터 또는 리소스에 대한 액세스 권한을 부여하거나 거부하는 프로세스입니다. 예를 들어 앱에서 사용자의 Google Drive에 액세스하기 위해 사용자의 동의를 요청합니다.

이전의 Google 로그인 플랫폼 라이브러리와 마찬가지로, 새로운 Google ID 서비스 라이브러리는 인증 및 승인 프로세스를 모두 지원하도록 빌드되었습니다.

그러나 최신 라이브러리는 개발자가 Google 계정을 앱과 통합하는 복잡성을 줄이기 위해 두 프로세스를 분리합니다.

인증과 관련된 사용 사례인 경우 이 페이지를 계속 읽어보세요.

사용 사례에 승인이 포함된 경우 사용자 승인 작동 방식Google ID 서비스로 이전을 읽고 애플리케이션에서 새롭게 개선된 API를 사용하고 있는지 확인하세요.

변경된 내용

새로운 Google ID 서비스 라이브러리는 사용자를 위해 다양한 사용성 개선사항을 제공합니다. 주요 내용은 다음과 같습니다.

  • 개별 단계가 줄어들면서 사용이 간편한 원탭 및 자동 로그인 흐름
  • 사용자 맞춤설정이 적용된 새로운 로그인 버튼
  • 일관된 브랜딩과 웹 전체에서 일관된 로그인 행동을 통해 이해와 신뢰를 개선하고
  • 사용자는 사이트에 빠르게 로그인할 수 있습니다.

Google은 개발자를 위해 복잡성을 줄이고 보안을 강화하며 최대한 쉽고 빠르게 통합을 구현하는 데 중점을 두었습니다. 이러한 개선사항 중 일부는 다음과 같습니다.

  • HTML을 사용하여 사이트의 정적 콘텐츠에 사용자 로그인을 추가하는 옵션,
  • 로그인 인증과 사용자 데이터 공유에서 분리하여 OAuth2 통합의 복잡성이 더 이상 필요하지 않습니다.
  • 팝업 모드와 리디렉션 모드 모두 계속 지원되지만 이제 Google의 OAuth2 인프라가 백엔드 서버의 로그인 엔드포인트로 리디렉션됩니다.
  • 이전의 Google ID 및 Google API 자바스크립트 라이브러리 기능을 하나의 새로운 라이브러리로 통합했습니다.
  • 로그인 응답의 경우 이제 프로미스 사용 여부를 결정할 수 있게 되었으며 편의를 위해 getter 스타일 함수를 통한 간접 수정이 삭제되었습니다.

로그인 이전 예시

기존 Google 로그인 버튼에서 이전 중이고 사용자가 사이트에 로그인하는 데만 관심이 있다면 가장 간단한 변경사항은 새로운 맞춤설정된 버튼으로 업데이트하는 것입니다. 이를 위해서는 자바스크립트 라이브러리를 바꾸고 새 로그인 객체를 사용하도록 코드베이스를 업데이트하면 됩니다.

라이브러리 및 구성

이전 Google 로그인 플랫폼 라이브러리인 apis.google.com/js/platform.js자바스크립트용 Google API 클라이언트 라이브러리: gapi.client는 더 이상 사용자 인증 및 승인에 필요하지 않습니다. 새로운 단일 Google ID 서비스 자바스크립트 라이브러리 accounts.google.com/gsi/client로 대체되었습니다.

이전의 세 가지 자바스크립트 모듈인 로그인에 사용된 api, client, platform는 모두 apis.google.com에서 로드됩니다. 이전 라이브러리가 포함될 수 있는 위치를 식별하는 데 일반적으로 도움이 되는 방법은 다음과 같습니다.

  • 기본 로그인 버튼이 apis.google.com/js/platform.js을 로드하며
  • 맞춤 버튼 그래픽이 apis.google.com/js/api:client.js을 로드합니다.
  • gapi.client를 직접 사용하면 apis.google.com/js/api.js가 로드됩니다.

대부분의 경우 기존 웹 애플리케이션 클라이언트 ID 사용자 인증 정보를 계속 사용할 수 있습니다. 마이그레이션의 일환으로 OAuth 2.0 정책을 검토하고 Google API 콘솔을 사용하여 다음 클라이언트 설정을 확인하고 필요한 경우 업데이트하는 것이 좋습니다.

  • 테스트 앱과 프로덕션 앱은 별도의 프로젝트를 사용하고 자체 클라이언트 ID를 갖습니다.
  • OAuth 2.0 클라이언트 ID 유형은 '웹 애플리케이션'이며
  • HTTPS는 승인된 자바스크립트 원본과 리디렉션 URI에 사용됩니다.

영향을 받는 코드 식별 및 테스트

디버그 쿠키는 영향을 받는 코드를 찾고 지원 중단 후 동작을 테스트하는 데 도움이 될 수 있습니다.

크거나 복잡한 앱에서는 gapi.auth2 모듈의 지원 중단에 영향을 받는 모든 코드를 찾기 어려울 수 있습니다. 지원 중단될 예정인 기능의 기존 사용을 콘솔에 로깅하려면 G_AUTH2_MIGRATION 쿠키의 값을 informational로 설정하세요. 원하는 경우 콜론 뒤에 키 값을 추가하여 세션 스토리지에도 로깅합니다. 로그인 및 사용자 인증 정보 수신 확인 또는 수집된 로그를 백엔드로 전송하여 나중에 분석합니다. 예를 들어 informational:showauth2use는 원본과 URL을 showauth2use이라는 세션 저장소 키에 저장합니다.

gapi.auth2 모듈이 더 이상 로드되지 않을 때 앱 동작을 확인하려면 G_AUTH2_MIGRATION 쿠키의 값을 enforced로 설정합니다. 그러면 시행일 이전에 지원 중단 후 동작을 테스트할 수 있습니다.

가능한 G_AUTH2_MIGRATION 쿠키 값은 다음과 같습니다.

  • enforced gapi.auth2 모듈을 로드하지 않습니다.
  • informational 지원 중단된 기능 사용을 JS 콘솔에 로깅합니다. 또한 키 이름(선택사항)이 설정된 경우 세션 저장소에 로깅합니다(informational:key-name).

사용자 영향을 최소화하려면 개발 및 테스트 중에 이 쿠키를 프로덕션 환경에서 사용하기 전에 먼저 로컬로 설정하는 것이 좋습니다.

HTML 및 자바스크립트

이 인증 전용 로그인 시나리오에서는 기존 Google 로그인 버튼의 예시 코드와 렌더링이 표시됩니다. 인증 응답이 자바스크립트 콜백 또는 백엔드 서버 로그인 엔드포인트로 보안 리디렉션에 의해 처리되는 방식의 차이를 확인하려면 팝업 또는 리디렉션 모드를 선택합니다.

옛날 방식

Google 로그인 버튼을 렌더링하고 콜백을 사용하여 사용자의 브라우저에서 직접 로그인을 처리합니다.

<html>
  <body>
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <meta name="google-signin-client_id" content="YOUR_CLIENT_ID">
    <div class="g-signin2" data-onsuccess="handleCredentialResponse"></div>
  </body>
</html>

리디렉션 모드

사용자의 브라우저에서 백엔드 서버 로그인 엔드포인트에 대한 AJAX 호출로 끝나는 Google 로그인 버튼을 렌더링합니다.

<html>
  <body>
    <script src="https://apis.google.com/js/platform.js" async defer></script>
    <meta name="google-signin-client_id" content="YOUR_CLIENT_ID">
    <div class="g-signin2" data-onsuccess="handleCredentialResponse"></div>
    <script>
      function handleCredentialResponse(googleUser) {
        ...
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'https://yourbackend.example.com/tokensignin');
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.onload = function() {
          console.log('Signed in as: ' + xhr.responseText);
        };
        xhr.send('idtoken=' + id_token);
      }
    </script>
  </body>
</html>

렌더링됨

새로운 시각적 속성을 사용하면 맞춤설정된 버튼을 만드는 기존 방식을 간소화하고 gapi.signin2.render() 호출을 없애며 사이트에 이미지와 시각적 애셋을 호스팅하고 유지해야 할 필요가 없습니다.

Google 로그인 Google 로그인

사용자 로그인 상태 업데이트 버튼 텍스트

새로운 방식

간단한 인증 전용 로그인 시나리오에서 새 라이브러리를 사용하려면 팝업 또는 리디렉션 모드에서 선택하고 코드 샘플을 사용하여 로그인 페이지의 기존 구현을 대체합니다.

콜백을 사용하여 사용자의 브라우저에서 직접 로그인을 처리합니다.

<html>
  <body>
    <script src="https://accounts.google.com/gsi/client" async defer></script>
    <div id="g_id_onload"
         data-client_id="YOUR_CLIENT_ID"
         data-callback="handleCredentialResponse">
    </div>
    <div class="g_id_signin" data-type="standard"></div>
  </body>
</html>

리디렉션 모드

Google에서 data-login_url 속성에 지정된 대로 로그인 엔드포인트를 호출합니다. 이전에는 POST 작업과 매개변수 이름을 담당했습니다. 새 라이브러리는 credential 매개변수의 엔드포인트에 ID 토큰을 게시합니다. 마지막으로 백엔드 서버에서 ID 토큰을 확인합니다.

<html>
  <body>
    <script src="https://accounts.google.com/gsi/client" async defer></script>
    <div id="g_id_onload"
         data-client_id="YOUR_CLIENT_ID"
         data-ux_mode="redirect"
         data-login_uri="https://www.example.com/your_login_endpoint">
    </div>
    <div class="g_id_signin" data-type="standard"></div>
  </body>
</html>

렌더링됨

visual-attributes를 사용하여 Google 계정으로 로그인 버튼 크기, 모양, 색상을 맞춤설정합니다. 원탭 탭 및 맞춤설정 버튼을 표시하여 로그인률을 개선합니다.

Google 계정으로 로그인 버튼 원탭 팝업

사용자 로그인 상태가 버튼 텍스트를 '로그인'에서 '로그인됨'으로 업데이트하지 않습니다. 사용자가 동의를 하거나 재방문 시 맞춤설정 버튼에는 사용자의 이름, 이메일, 프로필 사진이 포함됩니다.

이 간단한 인증 전용 예에서는 새 accounts.google.com/gsi/client 라이브러리, g_id_signin 클래스, g_id_onload 객체가 이전 apis.google.com/js/platform.js 라이브러리 및 g-signin2 객체를 대체합니다.

예시 코드는 맞춤설정 버튼을 새로 렌더링하는 것 외에도 새로운 원탭 팝업도 표시합니다. 맞춤설정된 버튼을 표시할 때마다 원탭 팝업도 표시하여 가입과 로그인에서 사용자의 불편을 최소화하는 것이 좋습니다.

로그인 문제가 증가하여 권장되지는 않지만 원탭 대화상자를 표시하지 않고도 새로운 맞춤설정된 버튼을 단독으로 표시할 수 있습니다. 이렇게 하려면 data-auto_prompt 속성을 false로 설정합니다.

HTML 및 자바스크립트 API

위의 예는 새로운 HTML API를 사용하여 웹사이트에 로그인을 추가하는 방법을 보여줍니다. 또는 기능적으로 동등한 자바스크립트 API를 사용하거나 사이트 전체에서 HTML 및 자바스크립트 API를 혼합하여 사용할 수도 있습니다.

콜백 유형, 색상, 크기, 모양, 텍스트, 테마와 같은 버튼 맞춤설정 옵션을 대화형으로 보려면 코드 생성기를 확인하세요. 다양한 옵션을 빠르게 비교하고 사이트에서 사용할 HTML 스니펫을 생성하는 데 사용할 수 있습니다.

원탭으로 모든 페이지에서 로그인

원탭은 사용자가 간편하게 사이트에 가입하거나 로그인할 수 있는 편리한 방법입니다. 이렇게 하면 사이트의 모든 페이지에서 사용자 로그인을 직접 사용 설정할 수 있으므로 사용자가 전용 로그인 페이지를 방문할 필요가 없습니다. 즉, 사용자가 로그인 페이지 이외의 페이지에서 유연하게 가입 및 로그인할 수 있도록 하여 로그인 및 로그인 문제를 줄입니다.

페이지에서 로그인을 사용 설정하려면 사이트 전체의 공유 헤더, 바닥글 또는 기타 객체에 g_id_onload를 포함하는 것이 좋습니다.

또한 로그인 또는 사용자 계정 관리 페이지에만 맞춤설정된 로그인 버튼을 표시하는 g_id_signin를 추가하는 것이 좋습니다. 다른 제휴 ID 공급업체 버튼 및 사용자 이름 및 비밀번호 입력란과 함께 버튼을 표시하여 사용자에게 로그인 또는 로그인 옵션을 제공합니다.

토큰 응답

사용자 로그인 시 더 이상 OAuth2 승인 코드, 액세스 토큰 또는 갱신 토큰을 이해하거나 사용할 필요가 없습니다. 대신 JSON 웹 토큰(JWT) ID 토큰을 사용하여 로그인 상태와 사용자 프로필을 공유합니다. 단순화하기 위해 더 이상 사용자 프로필 데이터 작업을 위해 'getter' 스타일의 접근자 메서드를 사용할 필요가 없습니다.

안전한 Google 서명 JWT ID 사용자 인증 정보가 다음과 같이 반환됩니다.

  • 팝업 모드에서 사용자의 브라우저 기반 자바스크립트 콜백 핸들러에 추가합니다.
  • 백엔드 서버로 리디렉션합니다.

두 경우 모두 다음을 삭제하여 기존 콜백 핸들러를 업데이트합니다.

대신 새 JWT CredentialResponse 객체의 credential 하위 필드에 직접 참조를 사용하여 사용자 프로필 데이터로 작업합니다.

또한 리디렉션 모드의 경우에만 크로스 사이트 요청 위조 (CSRF)를 방지하고 백엔드 서버에서 Google ID 토큰을 확인해야 합니다.

사용자가 사이트와 상호작용하는 방식을 더 잘 이해하기 위해 CredentialResponse의 select_by 필드를 사용하여 사용자 동의 결과 및 사용되는 특정 로그인 흐름을 확인할 수 있습니다.

사용자가 웹사이트에 처음 로그인하면 Google은 사용자에게 계정 프로필을 앱과 공유하는 데 동의하라는 메시지를 표시합니다. 동의를 한 후에만 사용자의 프로필이 ID 토큰 사용자 인증 정보 페이로드에서 앱에 공유됩니다. 이 프로필에 대한 액세스를 취소하는 것은 이전 로그인 라이브러리에서 액세스 토큰을 취소하는 것과 같습니다.

사용자는 https://myaccount.google.com/permissions를 방문하여 권한을 취소하고 Google 계정에서 앱의 연결을 해제할 수 있습니다. 또는 개발자가 구현하는 API 호출을 트리거하여 앱에서 직접 연결 해제할 수도 있습니다. 이전의 disconnect 메서드는 최신 revoke 메서드로 대체되었습니다.

사용자가 플랫폼에서 계정을 삭제하면 revoke를 사용하여 Google 계정에서 앱을 연결 해제하는 것이 좋습니다.

이전에는 앱에서 사용자 로그아웃을 관리하는 데 auth2.signOut()를 사용할 수 있었습니다. auth2.signOut()의 모든 사용을 삭제해야 하며 앱은 사용자 세션 상태 및 로그인 상태별로 직접 관리해야 합니다.

세션 상태 및 리스너

새 라이브러리는 웹 앱의 로그인 상태 또는 세션 상태를 유지하지 않습니다.

Google 계정의 로그인 상태, 앱의 세션 상태와 로그인 상태는 별개의 개념입니다.

사용자의 Google 계정 및 앱에 대한 사용자 로그인 상태는 서로 독립적입니다. 단, 사용자가 성공적으로 인증되어 Google 계정에 로그인되었다는 것을 알고 있는 경우는 예외입니다.

Google로 로그인, 사이트에 원탭 또는 자동 로그인이 포함되면 사용자가 먼저 Google 계정에 로그인해야 다음 작업을 할 수 있습니다.

  • 사이트에 처음 가입하거나 로그인할 때 사용자 프로필 공유에 동의해야 합니다.
  • 이후에 사이트를 다시 방문할 때 로그인

사용자가 웹사이트에서 활성 상태의 로그인 세션을 유지하면서 로그인, 로그아웃 또는 다른 Google 계정으로 전환할 수 있습니다.

이제 웹 앱 사용자의 로그인 상태를 직접 관리할 책임이 있습니다. 이전에는 Google 로그인이 사용자의 세션 상태 모니터링을 지원했습니다.

auth2.attachClickHandler() 및 등록된 콜백 핸들러에 관한 참조를 삭제합니다.

이전에는 Google 리스너를 사용하여 사용자의 Google 계정 로그인 상태 변경을 공유했습니다. 리스너는 더 이상 지원되지 않습니다.

listen(), auth2.currentUser, auth2.isSignedIn에 관한 참조를 삭제합니다.

쿠키

Google 계정으로 로그인의 경우 쿠키 사용이 제한됩니다. 이 쿠키에 대한 설명이 이어집니다. Google에서 사용하는 다른 쿠키 유형에 대한 자세한 내용은 Google이 쿠키를 사용하는 방법을 참조하세요.

이전 Google 로그인 플랫폼 라이브러리에서 설정된 G_ENABLED_IDPS 쿠키는 더 이상 사용되지 않습니다.

새 Google ID 서비스 라이브러리에서 구성 옵션에 따라 이러한 교차 도메인 쿠키를 선택적으로 설정할 수도 있습니다.

  • g_state는 사용자 로그아웃 상태를 저장하고 원탭 팝업 또는 자동 로그인을 사용할 때 설정됩니다.
  • g_csrf_tokenCSRF 공격을 방지하는 데 사용되는 이중 제출 쿠키이며 로그인 엔드포인트가 호출될 때 설정됩니다. 로그인 URI의 값을 명시적으로 설정하거나 현재 페이지의 URI를 기본값으로 설정할 수 있습니다. 로그인 엔드포인트는 다음을 사용할 때 이러한 조건에서 호출될 수 있습니다.

    • HTML API(data-ux_mode=redirect 포함) 또는 data-login_uri가 설정된 경우

    • ux_mode=redirect를 사용하고 원탭 또는 자동 로그인을 표시하는 데 google.accounts.id.prompt()를 사용하지 않는 자바스크립트 API

쿠키를 관리하는 서비스가 있는 경우 두 개의 새 쿠키를 추가하고 이전이 완료되면 기존 쿠키를 삭제해야 합니다.

여러 도메인 또는 하위 도메인을 관리하는 경우 g_state 쿠키 사용에 대한 자세한 안내는 하위 도메인에 원탭 표시를 참고하세요.

사용자 로그인을 위한 객체 마이그레이션 참조

변경 전 신규 메모
자바스크립트 라이브러리
apis.google.com/js/platform.js accounts.google.com/gsi/client 기존 항목을 새 기기로 교체합니다.
apis.google.com/js/api.js accounts.google.com/gsi/client 기존 항목을 새 기기로 교체합니다.
GoogleAuth 객체 및 관련 메서드를 사용합니다.
GoogleAuth.attachClickHandler() JS 및 HTML data-callbackIdConfiguration.callback 기존 항목을 새 기기로 교체합니다.
GoogleAuth.currentUser.get() CredentialResponse 더 이상 필요하지 않은 CredentialResponse를 대신 사용하세요.
GoogleAuth.currentUser.listen() 삭제. Google에서 사용자의 현재 로그인 상태를 확인할 수 없습니다. 동의 및 로그인 순간을 위해 사용자가 Google에 로그인해야 합니다. CredentialResponse의 select_by 필드를 사용하여 사용된 로그인 방법과 함께 사용자 동의 결과를 확인할 수 있습니다.
GoogleAuth.disconnect() 클래스의 생성자 google.accounts.id.revoke 기존 항목을 새 기기로 교체합니다. https://myaccount.google.com/permissions에서 취소가 발생할 수도 있습니다.
GoogleAuth.grantOfflineAccess() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
GoogleAuth.isSignedIn.get() 삭제. Google에서 사용자의 현재 로그인 상태를 확인할 수 없습니다. 동의 및 로그인 순간을 위해 사용자가 Google에 로그인해야 합니다.
GoogleAuth.isSignedIn.listen() 삭제. Google에서 사용자의 현재 로그인 상태를 확인할 수 없습니다. 동의 및 로그인 순간을 위해 사용자가 Google에 로그인해야 합니다.
GoogleAuth.signIn() 클래스의 생성자 삭제. g_id_signin 요소 또는 google.accounts.id.renderButton에 대한 JS 호출을 HTML DOM 로드하면 Google 계정에 대한 사용자 로그인이 트리거됩니다.
GoogleAuth.signOut() 삭제. 앱과 Google 계정의 사용자 로그인 상태는독립적입니다. Google에서는 앱의 세션 상태를 관리하지 않습니다.
GoogleAuth.then() 삭제. GoogleAuth가 지원 중단되었습니다.
GoogleUser 객체 및 관련 메서드를 소개합니다.
GoogleUser.disconnect() google.accounts.id.revoke 기존 항목을 새 기기로 교체합니다. https://myaccount.google.com/permissions에서 취소가 발생할 수도 있습니다.
GoogleUser.getAuthResponse()
GoogleUser.getBasicProfile() CredentialResponse BasicProfile 메서드 대신 credential 및 하위 필드를 직접 사용합니다.
GoogleUser.getGrantedScopes() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
GoogleUser.getHostedDomain() CredentialResponse 대신 credential.hd를 직접 사용하세요.
GoogleUser.getId() CredentialResponse 대신 credential.sub를 직접 사용하세요.
GoogleUser.grantOfflineAccess() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
GoogleUser.grant() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
GoogleUser.hasGrantedScopes() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
GoogleUser.isSignedIn() 삭제. Google에서 사용자의 현재 로그인 상태를 확인할 수 없습니다. 동의 및 로그인 순간을 위해 사용자가 Google에 로그인해야 합니다.
GoogleUser.reloadAuthResponse() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2 객체 및 관련 메서드:
gapi.auth2.AuthorizeConfig 객체 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.AuthorizeResponse 객체 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.AuthResponse 객체 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.authorized() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.ClientConfig() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.getAuthInstance() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.init() 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.OfflineAccessOptions 객체 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.auth2.SignInOptions 객체 삭제. OAuth2 액세스 토큰과 범위가 ID 토큰으로 대체되었습니다.
gapi.signin2 객체 및 관련 메서드를 호출합니다.
gapi.signin2.render() 삭제. g_id_signin 요소 또는 google.accounts.id.renderButton에 대한 JS 호출을 HTML DOM 로드하면 Google 계정에 대한 사용자 로그인이 트리거됩니다.