스프링/시큐리티

시큐리티 - (3) 권한 및 구글 로그인 설정

walbe0528 2022. 7. 2. 17:06
728x90
반응형

 

먼저, manager과 admin권한을 갖고 있는 user를 생성해준다.

 

@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)  // secure 어노테이션을 활성화, preAuthorize 어노테이션을 활성화
  • securedEnabled = true : secure어노테이션을 활성화해줌.
  • prePostEnabled = true : preAuthorize, postAuthorize 어노테이션을 활성화해줌.

 

@Secured("ROLE_ADMIN")  // 먼저 SecurityConfig에서 활성화 해주고, 특정 메소드에 간단하게 걸고 싶을때
@GetMapping("/info")
public @ResponseBody String info(){
    return "개인정보";
}

@PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") // data메소드가 실행되기 직전에 실행된다
// @PostAuthorize()  // 메소드가 끝나고 난 뒤에 실행된다
@GetMapping("/data")
public @ResponseBody String data(){
    return "개인정보";
}

 

  • @Secured("ROLE_ADMIN") : admin권한을 갖고 있는 사용자만 접근 가능하다. 특정 메소드에 간단하게 걸어주고 싶을때 주로 사용한다
  • @PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") : 메소드가 실행되기 직전에 실행되는 어노테이션으로, manager와 admin권한이 있는 사용자만 접근 가능하다. 

(+ @PostAuthorize()라는 메소드가 끝나고 실행되는 어노테이션도 있지만 거의 사용하지 X)

 

위의 어노테이션은 사용 전에 SecurityConfig에 @EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) 의 어노테이션을 달아서 활성화 시켜주어야 사용가능하다. 

 

 

🎈 소셜 로그인 - 구글

 

아래의 구글 api 콘솔 사이트에 접속해서 새 프로젝트를 생성해준다. 

 

https://console.cloud.google.com/apis/dashboard?hl=ko 

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

  • 생성한 프로젝트 선택 -> OAuth 동의화면 -> 만들기 -> 애플리케이션 이름 설정 -> 저장
  • 사용자 인증 정보 화면 만들기 -> 사용자 인증정보 만들기 -> OAuth 클라이언트 ID로 선택, 애플리케이션 유형은 웹 애플리케이션, 이름 설정해주기 -> 리다이렉션 URI 넣어주기 -> 만들기

 

 

사용자가 구글 로그인을 완료하고 나면, 구글 서버에서 우리한테 인증이 되었다는 뜻의 code를 리턴해준다. 이 code를 통해서 access token을 요청하는데, access token으로 사용자 대신에 우리의 서버가 구글 서버에 사용자의 개인정보에 접근할 수 있는 권한이 생긴다. 

 

즉, 필요한 정보를 조회하기 위해 access token이 필요해서 code를 받아야 한다.  승인된 리디렉션 URI는 이 코드를 받을 수 있는 주소이다. 승인된 리디렉션 URI는 고정된 주소로, 도메인 주소를 제외한http://localhost:8080/login/oauth2/code/google(facebook..등등)의 파란 부분은 고정된 주소로, 임의로 바꾸면 안된다.

 

개발자가 제어하는 것이 아니라 라이브러리가 알아서 처리해주기 때문에,

이 URI에 대한 controller의 주소를 만들 필요가 없다!

 

만들기를 클릭하면 OAuth 클라이언트가 생성되는데, 클라이언트 ID와 클라이언트 보안 비밀번호는 노출되면 안되는 정보이므로, 조심해야 한다. 

다시 프로젝트로 돌아가 설정을 추가해준다. 

 

1. build.gradle에 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

 

2. application.yml에 구글 로그인 관련 부분을 추가해준다. 

이전에 만들었던 클라이언트 ID와 클라이언트 보안 비밀번호를 적어주고, 어떤 정보를 받아올 것인지 scope를 설정해준다. (이메일과 프로필을 받아올 예정)

security:
  oauth2:
    client:
      registration:
        google:
          client-id: 445283137861-cq8hs959qa2g4htpe5r2gtt2jltedini.apps.googleusercontent.com
          client-secret: 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
          scope:
          - email
          - profile

 

3. 화면에 접속을 위한 구글 로그인을 추가해준다. 이때 "/oauth2/authorization/google" 또한 oauth-client 라이브러리를 사용하면 고정된 주소로, 임의로 변경할 수 없다.

<a href="/oauth2/authorization/google">구글 로그인</a>

 

서버를 실행시켜 구글 로그인을 클릭하면 아래처럼 나온다.

해당 주소에 대해서 아직 매핑된게 없기 때문에 404에러가 뜬다. 

 

- 구글 로그인 클릭시 화면을 보여주기 위해 SecurityConfig를 수정해준다.  

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.csrf().disable();
    http.authorizeRequests()
            .antMatchers("/user/**").authenticated()  // 해당 주소로 들어가려면 인증이 필요하다
            .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")  // admin과 manager권한이 있는 사람만 접속 가능
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
            .anyRequest().permitAll() // 다른 주소는 모두 허용
            .and()
            .formLogin()
            .loginPage("/loginForm") // 권한이 없는 페이지에 접속했을때 로그인 페이지가 나오도록 설정
            .loginProcessingUrl("/login")  // /login주소가 호출되면, 시큐리티가 낚아채서 대신 로그인을 진행한다.
    // 컨트롤러에 /login을 만들 필요가 없음!
            .defaultSuccessUrl("/")  // 로그인 성공시 메인페이지로 이동
            .and()
            .oauth2Login()
            .loginPage("/loginForm");
}

 

oauth2Login이 되었을때 loginForm페이지로 넘어가도록 만들어준다. 

다시 접속했을때, 구글 로그인 클릭시 아래 화면처럼 나오면 성공!

 

여기까지가 구글 로그인 인증을 완료이다. 아직 내 서버에서 아직 후처리 작업이 되지 않아 계정을 선택해도 로그인이 되지 않는다. 

728x90