1. 소개

이 사용방법(예제)에서는 Spring Security 의 OAuth 2.0 지원을 사용하여 Amazon Cognito 로 인증 하는 방법을 살펴 봅니다 .

그 과정에서 Amazon Cognito가 무엇이며 어떤 종류의 OAuth 2.0 흐름을 지원 하는지 간략하게 살펴 보겠습니다 .

결국 우리는 간단한 한 페이지 응용 프로그램을 갖게 될 것입니다. 멋진 것은 없습니다.

2. Amazon Cognito 란 무엇입니까?

Cognito는 여러 장치에서 앱의 사용자 데이터를 쉽게 관리 할 수 있는 사용자 ID 및 데이터 동기화 서비스 입니다.

Amazon Cognito를 사용하여 다음을 수행 할 수 있습니다.

  • 애플리케이션에 대한 사용자 생성, 인증 및 권한 부여
  • Google, Facebook 또는 Twitter와 같은 다른 공개 ID 제공 업체 를 사용하는 앱 사용자를위한 ID 생성
  • 앱의 사용자 데이터를 키-값 쌍으로 저장

3. 설정

3.1. Amazon Cognito 설정

아이덴티티 공급자로서 Cognito는 authorization_code, implicitclient_credentials 부여를 지원 합니다. 목적을 위해 authorization_code 부여 유형 을 사용하도록 설정해 보겠습니다 .

먼저, 약간의 Cognito 설정이 필요합니다.

애플리케이션 클라이언트의 구성 에서 CallbackURL 이 Spring 구성 파일 redirect-uri 와 일치 하는지 확인하십시오 . 우리의 경우 이것은 다음과 같습니다.

http://localhost:8080/login/oauth2/code/cognito

허용의 OAuth 흐름이 있어야한다 인증 코드를 부여합니다. 그런 다음, 동일한 페이지에 , 우리는 설정해야 허용의 OAuth 범위오픈 ID를.

사용자를 Cognito의 사용자 지정 로그인 페이지로 리디렉션하려면 사용자 풀 도메인도 추가해야합니다 .

3.2. Spring 설정

OAuth 2.0 로그인을 사용하고 싶기 때문에 애플리케이션에 적절한 Spring Security 의존성을 추가해야합니다.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-boot-starter-security-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>

그런 다음 모든 것을 하나로 묶기 위해 몇 가지 구성이 필요합니다.

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            clientId: clientId
            clientSecret: clientSecret
            scope: openid
            redirect-uri: http://localhost:8080/login/oauth2/code/cognito
            clientName: clientName
        provider:
          cognito:
            issuerUri: https://cognito-idp.{region}.amazonaws.com/{poolId}
            user-name-attribute: cognito:username

위 구성에서 clientId , clientSecret , clientNameissuerUri 속성 은 AWS에서 생성 된 사용자 풀앱 클라이언트에 따라 채워 져야합니다 .

이를 통해 Spring과 Amazon Cognito를 설정해야합니다! 사용방법(예제)의 나머지 부분에서는 앱의 Security 구성을 정의한 다음 몇 가지 느슨한 끝을 묶습니다.

3.3. 스프링 Security 구성

이제 Security 구성 클래스를 추가합니다.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
          .and()
          .authorizeRequests(authz -> authz.mvcMatchers("/")
            .permitAll()
            .anyRequest()
            .authenticated())
          .oauth2Login()
          .and()
          .logout()
          .logoutSuccessUrl("/");
    }
}

여기에서 먼저 CSRF 공격에 대한 보호가 필요하다고 명시한 다음 모든 사람이 랜딩 페이지에 액세스 할 수 있도록 허용했습니다. 그 후 Cognito 클라이언트 등록에 연결 하기 위해 oauth2Login대한 호출을 추가했습니다 .

4. 랜딩 페이지 추가

다음으로, 로그인 한 시점을 알 수 있도록 간단한 Thymeleaf 랜딩 페이지를 추가합니다 .

<div>
    <h1 class="title">OAuth 2.0 Spring Security Cognito Demo</h1>
    <div sec:authorize="isAuthenticated()">
        <div class="box">
            Hello, <strong th:text="${#authentication.name}"></strong>!
        </div>
    </div>
    <div sec:authorize="isAnonymous()">
        <div class="box">
            <a class="button login is-primary" th:href="@{/oauth2/authorization/cognito}">
              Log in with Amazon Cognito</a>
        </div>
    </div>
</div>

간단히 말해서, 로그인하면 사용자 이름이 표시되고 그렇지 않으면 로그인 링크가 표시됩니다. 이후 링크 외모가 좋아에주의 가 집어  cognito의 우리의 구성 파일에서 일부를.

그런 다음 응용 프로그램 루트를 시작 페이지에 연결 해야 합니다.

@Configuration
public class CognitoWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

5. 앱 실행

이것은 인증과 관련된 모든 것을 작동시키는 클래스입니다.

@SpringBootApplication
public class SpringCognitoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCognitoApplication.class, args);
    }
}

이제 우리는 우리의 응용 프로그램을 시작할 수 있습니다 로 이동 // localhost를 : 8080 HTTP , 하고 로그인 링크를 클릭합니다. AWS에서 생성 한 사용자의 자격 증명을 입력 할 때 Hello, username 메시지 를 볼 수 있어야 합니다.

6. 결론

이 사용방법(예제)에서는 간단한 구성만으로 Spring Security를 ​​Amazon Cognito와 통합하는 방법을 살펴 보았습니다. 그런 다음 몇 가지 코드로 모든 것을 통합합니다.

항상 그렇듯이이 기사에 제시된 코드는 Github에서 사용할 수 있습니다  .