OAuth2는 최신 애플리케이션에서 널리 사용되는 인증 및 권한 부여 프로토콜 중 하나입니다. 이를 통해 사용자는 사용자의 민감한 정보가 유출되지 않도록 보호하면서 타사 애플리케이션이 자신의 리소스에 액세스하도록 권한을 부여할 수 있습니다. 이 기사에서는 Java 백엔드 개발을 사용하여 OAuth2 기반의 보안 API를 구축하는 방법을 소개합니다.
OAuth2는 애플리케이션 간 인증 문제를 해결하기 위해 설계된 인기 있는 인증 프로토콜입니다. 이를 통해 사용자는 사용자 자격 증명이 손상되지 않도록 보호하면서 Google Drive 또는 Facebook 계정과 같은 리소스에 액세스할 수 있도록 타사 애플리케이션을 승인할 수 있습니다. OAuth2에는 리소스 소유자, 클라이언트, 권한 부여 서버 및 리소스 서버의 4가지 역할이 포함되어 있습니다. 리소스 소유자는 보호되는 리소스가 있는 사용자 또는 엔터티입니다. 클라이언트는 리소스에 대한 액세스를 요청하는 애플리케이션입니다. 리소스 서버는 리소스 소유자의 신원을 확인하는 서버입니다. 리소스를 저장하고 제공하는 서버입니다. OAuth2는 인증 서버를 통해 토큰을 발급하고 클라이언트는 토큰을 사용하여 리소스 서버에 리소스를 요청합니다.
OAuth2 프로세스는 다음 단계로 구성됩니다.
보안 API를 구축하려면 다음 단계를 구현해야 합니다.
다음은 Java 및 Spring 프레임워크를 기반으로 한 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); }
}
@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(); }
}
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; }
@GetMapping("/resource") public ResponseEntity<String> getResource() { return ResponseEntity.ok("resource"); }
@Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/oauth/**").permitAll() .anyRequest().authenticated() .and() .oauth2ResourceServer() .jwt(); }
}를 확장합니다.
위 내용은 Java 백엔드 개발: OAuth2 기반의 보안 API 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!