전체 보기
🍀

AWS Cognito+Spring Security 이용한 회원가입_(3)

작성일자
2023/05/27
태그
DIARY_DEVELOP
프로젝트
NOI
책 종류
1 more property
사용자 풀을 모두 생성했다면, 이제 백엔드에서는 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
복사

참고

amazon-cognito-developer-authentication-sample
aws-samples