1. 소개
이 사용방법(예제)에서는 Spring Security 의 OAuth 2.0 지원을 사용하여 Amazon Cognito 로 인증하는 방법을 살펴보겠습니다 .
그 과정에서 Amazon Cognito가 무엇이고 어떤 종류의 OAuth 2.0 흐름을 지원 하는지 간략하게 살펴보겠습니다 .
결국에는 간단한 한 페이지 응용 프로그램을 갖게 됩니다. 멋진 것은 없습니다.
2. Amazon Cognito란 무엇입니까?
Cognito는 여러 장치에서 앱의 사용자 데이터를 쉽게 관리할 수 있게 해주는 사용자 ID 및 데이터 동기화 서비스입니다.
Amazon Cognito를 사용하면 다음을 수행할 수 있습니다.
- 애플리케이션에 대한 사용자 생성, 인증 및 권한 부여
- Google, Facebook 또는 Twitter와 같은 다른 공개 ID Provider 를 사용하는 당사 앱 사용자의 ID 생성
- 앱의 사용자 데이터를 키-값 쌍으로 저장
3. 설정
3.1. Amazon Cognito 설정
ID 제공자로서 Cognito는 authorization_code, implicit 및 client_credentials 부여 를 지원 합니다. 우리의 목적을 위해 authorization_code 권한 부여 유형을 사용하도록 설정하겠습니다.
먼저 약간의 Cognito 설정이 필요합니다.
- 사용자 풀 생성
- 사용자 추가 – 이 사용자를 사용하여 Spring 애플리케이션에 로그인합니다.
- 앱 클라이언트 만들기
- 앱 클라이언트 구성
애플리케이션 클라이언트 구성 에서 CallbackURL 이 Spring 구성 파일 의 redirect-uri 와 일치 하는지 확인하십시오 . 우리의 경우에는 다음과 같습니다.
http://localhost:8080/login/oauth2/code/cognito
Allowed OAuth 흐름 은 인증 코드 부여 여야 합니다 . 그런 다음 동일한 페이지 에서 Allowed OAuth 범위 를 openid 로 설정해야 합니다 .
사용자를 Cognito의 사용자 지정 로그인 페이지로 리디렉션하려면 사용자 풀 도메인 도 추가해야 합니다 .
3.2. 스프링 설정
OAuth 2.0 로그인을 사용하고 싶기 때문에 애플리케이션에 spring-security-oauth2-client 및 spring-security-oauth2-jose 의존성을 추가해야 합니다.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-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 , clientName 및 issuerUri 는 AWS에서 생성된 사용자 풀 및 앱 클라이언트 에 따라 채워져야 합니다 .
이제 Spring과 Amazon Cognito를 설정해야 합니다! 사용방법(예제)의 나머지 부분에서는 앱의 Security 구성을 정의한 다음 몇 가지 느슨한 끝을 묶습니다.
3.3. 스프링 Security 구성
이제 Security 구성 클래스를 추가합니다.
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf()
.and()
.authorizeRequests(authz -> authz.mvcMatchers("/")
.permitAll()
.anyRequest()
.authenticated())
.oauth2Login()
.and()
.logout()
.logoutSuccessUrl("/");
return http.build();
}
}
여기에서 먼저 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);
}
}
이제 애플리케이션을 시작하고 http://localhost:8080 으로 이동 한 다음 로그인 링크를 클릭할 수 있습니다. AWS에서 생성한 사용자의 자격 증명을 입력하면 Hello, username 메시지 를 볼 수 있어야 합니다.
6. 결론
이 사용방법(예제)에서는 몇 가지 간단한 구성으로 Spring Security를 Amazon Cognito와 통합하는 방법을 살펴보았습니다. 그런 다음 몇 개의 코드로 모든 것을 통합합니다.
항상 그렇듯이 이 기사에 제시된 코드는 Github에서 사용할 수 있습니다 .