사용자 풀을 모두 생성했다면, 이제 백엔드에서는 Cognito의 관련 API를 호출할 수 있도록 설정해보자. 예를 들어 AWS SDK 또는 Cognito API를 사용하여 사용자 인증, 등록, 그룹 관리 등을 처리할 수 있다. 이때, 가장 먼저 클라이언트 보안키가 필요하다. 사용자 풀을 생성하는 법과 보안키를 확인하는 법은 지난 번 TIL에 정리되어 있다.
Cognito + Spring Security 연동
이 과정은 지난 번에 미리 해두었다. 지난 번 TIL 내용에 보충 설명을 더해 아래 작성한다.
•
build.gradle에 아래 코드 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'software.amazon.awssdk:cognitoidentityprovider:2.20.66'
}
Java
복사
◦
버전을 꼭 붙이자,,,,! 나는 버전을 안붙였다가 인식이 안되는 문제가 있어 한참 해맸다.
•
application.yml에 아래 코드 추가
// 예시 코드
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
Plain Text
복사
◦
clientId, clientSecret, clientName은 풀을 생성하며 만든 앱클라이언트 정보를 의미한다. 콘솔창에서 앱클라이언트 정보를 확인해 입력하자.
◦
issuerUri는 Cognito ID 풀(Cognito Identity Pool)의 발행자 URI를 나타냅니다.
▪
콘솔에서 "사용자 풀" 섹션으로 이동하고 해당하는 풀을 선택한 후, 사용자 풀 개요를 보면 풀 ID를 찾을 수 있다.
▪
region은 Cognito ID 풀이 있는 AWS 리전을 나타낸다. arn에 나와있으니 그걸 참고해도 좋다.
◦
user-name-attribute는 Cognito 사용자 풀(Cognito User Pool)의 사용자 이름 속성을 지정한다. 일반적으로 기본값인 "cognito:username"을 사용하며, 이는 Cognito 사용자 풀의 사용자 이름 속성을 나타낸다. Cognito 사용자 풀의 사용자 특성 설정에서 확인할 수 있다. AWS Cognito 콘솔에서 사용자 풀 섹션으로 이동하고 해당하는 풀을 선택한 후, 속성 탭으로 이동하면 사용자 이름 속성을 확인할 수 있다.
// 내 코드(개인 정보는 env 처리함)
spring:
security:
oauth2:
client:
registration:
cognito:
client-id: ${application.spring.security.oauth2.registration.client-id}
client-secret: ${application.spring.security.oauth2.registration.client-secret}
scope:
- openid
redirect-uri: ${application.spring.security.oauth2.registration.redirect-uri}
client-name: ${application.spring.security.oauth2.registration.client-name}
provider:
conito:
issuer-uri: ${application.spring.security.oauth2.provider.issuer-uri}
user-name-attribute: cognito:email
Java
복사
•
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("/");
}
}
Java
복사
Cognito+Spring Security 이용한 회원가입 구현
•
MemberSaveRequestDto
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MemberSaveRequest {
private String email;
private String password;
private String name;
private String birth;
private Gender gender;
private String role;
}
JavaScript
복사
•
MemberSaveResponseDto
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MemberSaveResponse {
private Long id;
private String email;
}
JavaScript
복사
•
MemberController
@RestController
@RequiredArgsConstructor
@Slf4j
public class MemberController {
@Value("${spring.security.oauth2.client.registration.cognito.aws-region}")
private String awsRegion;
@Value("${spring.security.oauth2.client.registration.cognito.client-id}")
private String clientId;
// 회원가입
@PostMapping("/auth/join")
public ResponseEntity<MemberSaveResponse> signUp(@RequestBody MemberSaveRequest memberSaveRequest) {
// AWS Cognito 클라이언트 생성
CognitoIdentityProviderClient cognitoClient = CognitoIdentityProviderClient.builder()
.region(Region.of(awsRegion))
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
// 회원가입 요청 생성
CognitoSaveRequest cognitoSaveRequest = CognitoSaveRequest.builder()
.clientId(clientId)
.email(memberSaveRequest.getEmail())
.password(memberSaveRequest.getPassword())
.build();
// 회원가입 요청 보내기
MemberSaveResponse memberSaveResponse = cognitoClient.signUp(cognitoSaveRequest);
// 회원가입 성공 시, 사용자의 Cognito ID 반환
return memberSaveResponse.userSub();
}
}
Java
복사