스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 05장
구글 서비스 등록
- 구글 클라우드 플랫폼에서 프로젝트 생성
- OAuth 클라이언트 ID로 사용자 인증 정보 생성
- 승인된 리디렉션 URI(인증이 성공하면 redirect할 URL):
http://localhost:8080/login/oauth2/code/google
- src/main/resources 디렉토리에 application-oauth.properties 파일 생성하여 클라이언트 ID(clientId), 보안 비밀 코드(clientSecret) 입력
- 위 파일 .gitignore에 등록
구글 로그인 연동
- domain/user 패키지 생성, User 클래스 생성
- user 패키지에 Role 클래스 생성
- 역할: 각 사용자의 권한을 관리할 Enum 클래스
- Enum: 요일, 계절과 같이 한정된 데이터만을 가지는 열거 타입(Enumeration Type)을 사용
- 스프링 시큐리티에서는 권한 코드에 항상
ROLE_
이 앞에 있어야 함
@Getter
@RequiredArgsConstructor
public enum Role {
GUEST("ROLE_GUEST", "손님"),
USER("ROLE_USER", "일반 사용자");
private final String key;
private final String title;
}
- user 패키지에 UserRepository 인터페이스 생성
스프링 시큐리티 설정
- build.gradle에 관련 의존성 추가
- OAuth 라이브러리를 이용한 소셜 로그인 설정 코드 작성
1. config.auth 패키지 생성: 시큐리티 관련 클래스가 들어있는 곳
2. SecurityConfig 클래스 생성
3. CustomOAuth2UserService 클래스 생성: 구글 로그인 이후 가져온 사용자 정보(email, name, picture)를 기반으로 가입/정보수정/세션 저장 등의 기능 지원
4. config.auth.dto 패키지 생성, OAuthAttributes 클래스 생성: OAuth2UserService를 통해 가져온 OAuth2User의 attribute 저장
5. config.auth.dto 패키지에 SessionUser 클래스 생성: 인증된 사용자 정보 저장
🚨 User 클래스를 세션을 저장하면 직렬화를 구현하지 않아 에러 발생(User 클래스는 엔티티, 언제 다른 엔티티와 관계가 형성될지 모름)
=> 직렬화 기능을 가진 세션 Dto를 추가하는 것이 향후 유지보수에 도움
로그인 테스트
-
index.mustache에 로그인 코드 추가
- {{#userName}}: 머스테치는 참, 거짓 여부만 판단하므로 최종값을 넘겨줘야 함
- a href="/logout": 스프링 시큐리티에서 기본적으로 제공하는 로그아웃 URL (따로 컨트롤러 만들 필요 X)
- {{^userName}}: 머스테치에서 해당 값이 없는 경우
- a href="/oauth2/authorization/google": 스프링 시큐리티에서 기본적으로 제공하는 로그인 URL
-
IndexController에서 userName을 모델에 저장하는 코드 추가
사용자의 권한을 GUEST에서 USER로 바꾸면 글 쓰기 가능
참고자료
https://honbabzone.com/java/java-enum/