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";
}
}