Spring Security [OAuth2 인증]

손정훈·2023년 3월 28일
0

OAuth2 동작 방식


Authorization Grant 유형

  • Authorization Code Grant : 권한 부여 승인 코드 방식
  • Implicit Grant : 암묵적 승인 방식
  • Resource Owner Password Credential Grant : 자원 소유자 자격 증명 승인 방식
  • Client Credentials Grant : 클라이언트 자격 증명 승인 방식

의존성 추가

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'    // HTML 화면 구성을 위한 타임리프 추가
	implementation 'org.springframework.boot:spring-boot-starter-security'     // spring-boot-starter-security 추가
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'  // 클라이언트로써의 역할을 하기 위해 spring-boot-starter-oauth2-client 추가
}

spring security 설정

@Configuration
public class SecurityConfiguration {
	@Value("${spring.security.oauth2.client.registration.google.clientId}")  
    private String clientId;

    @Value("${spring.security.oauth2.client.registration.google.clientSecret}") 
    private String clientSecret;
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .formLogin().disable()
            .httpBasic().disable()
            .authorizeHttpRequests(authorize -> authorize    // 인증된 request에 대해서만 접근을 허용
                    .anyRequest().authenticated()
            )
            .oauth2Login(withDefaults());    // OAuth 2 로그인 인증을 활성화
        return http.build();
    }
    
    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
        var clientRegistration = clientRegistration();    // ClientRegistration 인스턴스를 리턴 

        return new InMemoryClientRegistrationRepository(clientRegistration);   // InMemoryClientRegistrationRepository의 인스턴스를 생성
    }

    private ClientRegistration clientRegistration() {
        // ClientRegistration 인스턴스를 제공하는 역할
        return CommonOAuth2Provider
                .GOOGLE
                .getBuilder("google")
                .clientId(clientId)
                .clientSecret(clientSecret)
                .build();
    }
}

OAuth2AuthorizedClient를 핸들러 메서드의 파라미터로 전달받는 방법

@Controller
public class HelloHomeController {
    @GetMapping("/hello-oauth2")
    public String home(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient authorizedClient) { // Access Token 정보를 얻음

        OAuth2AccessToken accessToken = authorizedClient.getAccessToken();
        System.out.println("Access Token Value: " + accessToken.getTokenValue());
        System.out.println("Access Token Type: " + accessToken.getTokenType().getValue());
        System.out.println("Access Token Scopes: " + accessToken.getScopes());
        System.out.println("Access Token Issued At: " + accessToken.getIssuedAt());
        System.out.println("Access Token Expires At: " + accessToken.getExpiresAt());

        return "hello-oauth2";
    }
}

0개의 댓글