>  기사  >  백엔드 개발  >  Java 백엔드 개발: OAuth2 기반의 보안 API 구축

Java 백엔드 개발: OAuth2 기반의 보안 API 구축

王林
王林원래의
2023-06-17 10:37:471539검색

OAuth2는 최신 애플리케이션에서 널리 사용되는 인증 및 권한 부여 프로토콜 중 하나입니다. 이를 통해 사용자는 사용자의 민감한 정보가 유출되지 않도록 보호하면서 타사 애플리케이션이 자신의 리소스에 액세스하도록 권한을 부여할 수 있습니다. 이 기사에서는 Java 백엔드 개발을 사용하여 OAuth2 기반의 보안 API를 구축하는 방법을 소개합니다.

  1. OAuth2란 무엇인가요?

OAuth2는 애플리케이션 간 인증 문제를 해결하기 위해 설계된 인기 있는 인증 프로토콜입니다. 이를 통해 사용자는 사용자 자격 증명이 손상되지 않도록 보호하면서 Google Drive 또는 Facebook 계정과 같은 리소스에 액세스할 수 있도록 타사 애플리케이션을 승인할 수 있습니다. OAuth2에는 리소스 소유자, 클라이언트, 권한 부여 서버 및 리소스 서버의 4가지 역할이 포함되어 있습니다. 리소스 소유자는 보호되는 리소스가 있는 사용자 또는 엔터티입니다. 클라이언트는 리소스에 대한 액세스를 요청하는 애플리케이션입니다. 리소스 서버는 리소스 소유자의 신원을 확인하는 서버입니다. 리소스를 저장하고 제공하는 서버입니다. OAuth2는 인증 서버를 통해 토큰을 발급하고 클라이언트는 토큰을 사용하여 리소스 서버에 리소스를 요청합니다.

  1. OAuth2 프로세스

OAuth2 프로세스는 다음 단계로 구성됩니다.

  1. 클라이언트는 인증 서버에 요청하고 해당 식별자와 리디렉션 URI를 포함합니다.
  2. 인증 서버는 클라이언트의 신원을 확인하고 리소스 소유자가 클라이언트가 리소스에 액세스할 수 있도록 승인하도록 요구합니다.
  3. 리소스 소유자는 클라이언트가 자신의 리소스에 액세스할 수 있는 권한을 부여합니다.
  4. 인증 서버는 클라이언트에 액세스 토큰을 발급합니다.
  5. 클라이언트는 액세스 토큰을 사용하여 리소스 서버에 리소스에 대한 액세스를 요청합니다.
  6. 리소스 서버는 액세스 토큰이 유효한지 확인하고 리소스를 제공합니다.
  7. OAuth2 기반 보안 API 구축

보안 API를 구축하려면 다음 단계를 구현해야 합니다.

  1. OAuth2 서버 생성: 액세스 토큰을 발행하고, 클라이언트 ID를 인증하고, 요청을 승인합니다.
  2. Spring Security 구성: Spring Security는 인증 및 권한 부여를 처리하는 Spring 생태계의 보안 프레임워크입니다. Spring Security에 대한 OAuth2 인증 및 권한 부여 흐름을 구성해야 합니다.
  3. 클라이언트 생성: 리소스 서버에 대한 액세스를 요청하고 OAuth2 서버에서 액세스 토큰을 얻으려면 클라이언트를 생성해야 합니다.
  4. 리소스 서버 생성: 보호되는 리소스를 저장하고 제공하기 위해 리소스 서버를 생성해야 합니다.
  5. 액세스 토큰 확인: 리소스 서버에서 액세스 토큰이 유효한지 확인하고 토큰 범위에 따라 해당 리소스를 제공해야 합니다.

다음은 Java 및 Spring 프레임워크를 기반으로 한 OAuth2 예입니다.

  1. OAuth2 서버 만들기:

@EnableAuthorizationServer
@Configuration
public class OAuth2AuthorizationConfig 확장 AuthorizationServerConfigurerAdapter {

private final PasswordEncoder passwordEncoder;
private final AuthenticationManager authenticationManager;
private final UserDetailsService userDetailsService;

@Autowired
public OAuth2AuthorizationConfig(
        PasswordEncoder passwordEncoder,
        AuthenticationManager authenticationManager,
        UserDetailsService userDetailsService
) {
    this.passwordEncoder = passwordEncoder;
    this.authenticationManager = authenticationManager;
    this.userDetailsService = userDetailsService;
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
            .withClient("client")
            .secret(passwordEncoder.encode("secret"))
            .authorizedGrantTypes("authorization_code")
            .scopes("read", "write", "trust")
            .redirectUris("http://localhost:8080/login/oauth2/code/");
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
            .userDetailsService(userDetailsService);
}

}

  1. 스프링 보안 구성:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public 클래스 WebSecurityConfig는 WebSecurityConfigurerAdapter {

private final UserDetailsService userDetailsService;
private final PasswordEncoder passwordEncoder;

@Autowired
public WebSecurityConfig(
        UserDetailsService userDetailsService,
        PasswordEncoder passwordEncoder
) {
    this.userDetailsService = userDetailsService;
    this.passwordEncoder = passwordEncoder;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
}

}

  1. 클라이언트 생성: 공개 클래스 클라이언트 컨트롤러 {
  2. private final OAuth2AuthorizedClientService authorizedClientService;
    
    @Autowired
    public ClientController(OAuth2AuthorizedClientService authorizedClientService) {
        this.authorizedClientService = authorizedClientService;
    }
    
    @GetMapping("/resource")
    public ResponseEntity<String> getResource(OAuth2AuthenticationToken authentication) {
        OAuth2AuthorizedClient authorizedClient = authorizedClientService.loadAuthorizedClient(
                authentication.getAuthorizedClientRegistrationId(),
                authentication.getName()
        );
        HttpHeaders headers = new HttpHeaders();
        headers.setBearerAuth(authorizedClient.getAccessToken().getTokenValue());
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = new RestTemplate().exchange(
                "http://localhost:8081/resource",
                HttpMethod.GET,
                entity,
                String.class
        );
        return response;
    }
}


생성된 리소스 서버:

    @RestController
  1. public 클래스 ResourceController {
  2. @GetMapping("/resource")
    public ResponseEntity<String> getResource() {
        return ResponseEntity.ok("resource");
    }
}


액세스 토큰 확인:

    @Configuration
  1. @EnableResourceServer
  2. public 클래스 ResourceServerConfig는 ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/oauth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt();
}

}를 확장합니다.

리뷰

    이 글에서는 OAuth2 프로토콜의 프로세스를 소개하고 Java 및 Spring 프레임워크 기반의 예제를 제공합니다. OAuth2를 사용하면 보다 안전한 API를 구축하고 사용자의 민감한 정보가 유출되지 않도록 보호할 수 있습니다. API 개발에서는 사용자 데이터와 애플리케이션 리소스를 보호하기 위해 항상 보안에 주의를 기울여야 합니다.

위 내용은 Java 백엔드 개발: OAuth2 기반의 보안 API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.