App Engine 표준 환경에서 자바로 사용자 인증

자바용 Bookshelf 가이드 중 이 부분에서는 Google 계정 보유 사용자를 위한 로그인 과정을 만드는 방법과 프로필 정보를 사용하여 사용자에게 맞춤설정된 기능을 제공하는 방법을 보여줍니다.

이 페이지는 여러 페이지로 구성된 가이드의 일부입니다. 처음부터 시작하여 설정 안내를 보려면 자바 Bookshelf 앱으로 이동하세요.

로컬 머신에서 앱 실행

앱을 로컬로 실행하려면 다음 안내를 따르세요.

  1. getting-started-java/bookshelf-standard/4-auth 디렉터리에서 다음 명령어를 입력하여 로컬 웹 서버를 시작합니다.

    mvn package appengine:run -Dbookshelf.bucket=[YOUR-BUCKET]
    [YOUR-BUCKET]을 버킷 이름으로 바꿉니다.
  2. 웹브라우저에서 http://localhost:8080으로 이동합니다.

이제 앱의 웹페이지를 찾아보고 Google 계정으로 로그인하고 도서를 추가하고 상단 탐색 메뉴의 내 도서 링크를 사용하여 추가한 도서를 볼 수 있습니다.

App Engine 표준 환경에 앱 배포

App Engine 표준 환경에 배포하려면 다음 안내를 따르세요.

  1. Bookshelf 앱에 업로드된 Datastore 색인을 만들려면 책을 최소 한 개 이상 만든 후 내 도서를 클릭합니다오. clean 명령어를 사용하여 앱을 빌드하면 로컬 색인이 삭제되므로 배포하려는 앱의 빌드에서 이를 수행합니다.
  2. getting-started-java/bookshelf-standard/4-auth 디렉터리에서 다음 명령어를 입력하여 앱을 배포합니다.
  3. mvn appengine:deploy -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION] -Dbookshelf.bucket=[YOUR-BUCKET].appspot.com
    [YOUR-PROJECT-ID]를 프로젝트 ID로 바꾸고 [YOUR-VERSION]을 버전(예: 1 또는 2)으로 바꾸거나 사용하려는 다른 문자열 값으로 바꿉니다.
  4. 웹브라우저에 다음 URL을 입력합니다.

    https://PROJECT_ID.REGION_ID.r.appspot.com

    다음을 바꿉니다.

앱을 업데이트한 후에는 앱을 처음에 배포했을 때와 동일한 명령어를 입력하고 동일한 프로젝트 ID 및 버전을 지정하여 업데이트된 버전을 다시 배포할 수 있습니다. 현재 배포된 앱을 덮어씁니다. 업데이트된 명령줄에 다른 버전 문자열을 지정하면 새 배포에서 앱의 새 버전을 만들어 현재 제공되는 버전으로 승격시킵니다.

제공하지 않는 앱 버전을 삭제하면 비용을 줄일 수 있습니다.

앱 버전을 삭제하려면 다음 안내를 따르세요.

  1. Cloud Console에서 App Engine의 버전 페이지로 이동합니다.

    버전 페이지로 이동

  2. 삭제할 기본이 아닌 앱 버전의 체크박스를 선택합니다.
  3. 삭제 를 클릭하여 앱 버전을 삭제합니다.

청구 가능한 리소스 삭제에 대한 자세한 내용은 이 가이드의 마지막 단계에서 삭제를 참조하세요.

앱 구조

다음 다이어그램은 앱 구성요소와 서로 간의 연결 방식을 보여줍니다.

인증 샘플 구조

코드 이해하기

이 섹션에서는 앱 코드와 코드의 작동 방식을 살펴봅니다.

사용자가 로그인을 클릭하면 LoginServlet은 다음을 수행합니다.

  1. 사용자가 현재 Google 계정에 로그인되어 있는지 확인하고, 로그인되어 있으면 사용자의 이메일 및 ID 정보를 현재 세션에서 저장합니다.

  2. 사용자가 Google 계정에 로그인되어 있지 않으면 사용자가 Google 계정 로그인 페이지로 리디렉션됩니다. App Engine 사용자 서비스는 사용자 로그인을 위한 대부분의 복잡한 과정을 자동으로 처리합니다.

@SuppressWarnings("serial")
public class LoginServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    UserService userService = UserServiceFactory.getUserService();
    if (userService.isUserLoggedIn()) {
      // Save the relevant profile info and store it in the session.
      User user = userService.getCurrentUser();
      req.getSession().setAttribute("userEmail", user.getEmail());
      req.getSession().setAttribute("userId", user.getUserId());

      String destination = (String) req.getSession().getAttribute("loginDestination");
      if (destination == null) {
        destination = "/books";
      }

      resp.sendRedirect(destination);
    } else {
      resp.sendRedirect(userService.createLoginURL("/login"));
    }
  }
}

LogoutServletsession을 삭제하고 새 세션을 만듭니다.

@SuppressWarnings("serial")
public class LogoutServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {
    // you can also make an authenticated request to logout, but here we choose to
    // simply delete the session variables for simplicity
    HttpSession session =  req.getSession(false);
    if (session != null) {
      session.invalidate();
    }
    // rebuild session
    req.getSession();
  }
}