[Spring] 4주차 - 스프링 시큐리티, OAuth2.0으로 로그인 기능 구현

smjan27·2021년 11월 1일
0

Spring Boot

목록 보기
8/9

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 05장

구글 서비스 등록

  • 구글 클라우드 플랫폼에서 프로젝트 생성
    • OAuth 클라이언트 ID로 사용자 인증 정보 생성
    • 승인된 리디렉션 URI(인증이 성공하면 redirect할 URL): http://localhost:8080/login/oauth2/code/google
  • src/main/resources 디렉토리에 application-oauth.properties 파일 생성하여 클라이언트 ID(clientId), 보안 비밀 코드(clientSecret) 입력
  • 위 파일 .gitignore에 등록

구글 로그인 연동

  1. domain/user 패키지 생성, User 클래스 생성
    • 역할: 사용자 정보 담당 도메인
  2. 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;
}
  1. user 패키지에 UserRepository 인터페이스 생성
    • 역할: User의 CRUD 담당

스프링 시큐리티 설정

  1. build.gradle에 관련 의존성 추가
  2. 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를 추가하는 것이 향후 유지보수에 도움

로그인 테스트

  1. index.mustache에 로그인 코드 추가

    • {{#userName}}: 머스테치는 참, 거짓 여부만 판단하므로 최종값을 넘겨줘야 함
    • a href="/logout": 스프링 시큐리티에서 기본적으로 제공하는 로그아웃 URL (따로 컨트롤러 만들 필요 X)
    • {{^userName}}: 머스테치에서 해당 값이 없는 경우
    • a href="/oauth2/authorization/google": 스프링 시큐리티에서 기본적으로 제공하는 로그인 URL
  2. IndexController에서 userName을 모델에 저장하는 코드 추가

사용자의 권한을 GUEST에서 USER로 바꾸면 글 쓰기 가능

참고자료

https://honbabzone.com/java/java-enum/

profile
No Stress🎈 Be Happy✨

0개의 댓글