java OAuth 2 인증 서버 구축

OAuth 2 인증 서버 구축
표현 형식 을 보면 OAuth 2 권한 수여 서버 도 독립 된 마이크로 서비스 이기 때문에 권한 수여 서버 를 구축 하 는 방법 도 SpringBoot 응용 프로그램 을 만 드 는 것 이다.우 리 는 해당 하 는 Maven 의존 도 를 도입 해 야 한다.다음 과 같다.

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
</dependency>

이곳 의 spring-security-oauth 2 는 Spring Security 에서 온 OAuth 2 라 이브 러 리 입 니 다.현재 Maven 의존 도 는 추가 되 었 습 니 다.다음 단 계 는 Bootstrap 류 를 방문 의 입구 로 구축 하 는 것 입 니 다.

@SpringBootApplication
@EnableAuthorizationServer
public class AuthServer {
    public static void main(String[] args) {
        SpringApplication.run(AuthServer.class, args);
    }
}

여기에 새로운 주해@EnableAuthorizationServer 가 나 타 났 습 니 다.이 주해 의 역할 은 마이크로 서비스 운영 환경 에 OAuth 2 프로 토 콜 을 기반 으로 하 는 권한 수여 서 비 스 를 제공 하 는 것 입 니 다.이 권한 수여 서 비 스 는 RESTful 스타일 을 바탕 으로 하 는 일련의 단점(예 를 들 어/oath/authorise 와/oath/token)을 드 러 내 서 OAuth 2 권한 수여 절차 에 사용 할 수 있 습 니 다.
OAuth 2 권한 수여 서 비 스 를 구축 하 는 것 은 OAuth 2 프로 토 콜 을 통합 하 는 첫 번 째 단계 일 뿐 권한 수여 서버 는 중앙 시스템 으로 안전성 절차 와 관련 된 모든 클 라 이언 트 와 사용자 정 보 를 관리 하고 있다.따라서 다음 에 저 희 는 권한 수여 서버 에서 이러한 기본 정 보 를 초기 화 해 야 합 니 다.Spring Security 는 저 희 를 위해 다양한 설정 류 를 제공 하여 이 목 표를 실현 해 야 합 니 다.
클 라 이언 트 와 사용자 인증 정보 설정
OAuth 2.0 은 몇 가지 권한 수여 모델 이 있 습 니 다.권한 수여 코드 모델,간략화 모델,암호 모델,클 라 이언 트 증빙 모델 입 니 다.그 중에서 암호 모드 는 단순 성 으로 광범 위 하 게 응용 되 었 다.다음 내용 에서 우 리 는 암호 모드 를 예 로 들 어 설명 을 한다.
암호 모드 에서 사용 자 는 클 라 이언 트 에 사용자 이름과 비밀 번 호 를 제공 하고 사용자 이름과 비밀 번 호 를 권한 수여 서버 에 보 내 Token 을 요청 합 니 다.인증 서버 는 먼저 비밀번호 증빙 정 보 를 인증 하고 오류 가 없 음 을 확인 한 후 클 라 이언 트 에 Token 을 발급 합 니 다.전체 절 차 는 다음 그림 과 같다.

권한 수여 서버 가 여기에서 인증 작업 을 수행 하 는 목적 은 들 어 오 는 사용자 이름과 비밀번호 가 정확 한 지 검증 하 는 것 입 니 다.암호 모드 에서 이 단 계 는 필수 적 입 니 다.다른 권한 수여 모드 를 사용 하면 반드시 사용자 인증 이 있 는 것 은 아 닙 니 다.
암호 모드 를 사용 하 는 것 을 확인 한 후에 우 리 는 이 권한 수여 모델 을 실현 하기 위해 권한 수여 서버 에 대해 어떤 개발 작업 을 해 야 하 는 지 알 아 보 겠 습 니 다.우선 클 라 이언 트 정보 와 사용자 정 보 를 포함 한 기본 데 이 터 를 설정 해 야 합 니 다.
클 라 이언 트 정보 설정
우 리 는 먼저 클 라 이언 트 정 보 를 어떻게 설정 하 는 지 보 겠 습 니 다.클 라 이언 트 를 설정 할 때 사용 하 는 설정 클래스 는 Client Details ServiceConfigurer 입 니 다.이 설정 클래스 는 클 라 이언 트 의 상세 한 서비스 Client Details 서 비 스 를 설정 하 는 데 사 용 됩 니 다.클 라 이언 트 의 상세 한 상황 을 설명 하 는 클 라 이언 트 Details 인 터 페 이 스 는 안전성 제어 와 관련 된 여러 가지 중요 한 방법 을 포함 하고 이 인터페이스의 일부 방법 은 다음 과 같이 정의 한다.

public interface ClientDetails extends Serializable {
     //       Id
     String getClientId();
     //      
     String getClientSecret();
     //        
     Set<String> getScope();
     //            

     Set<String> getAuthorizedGrantTypes();
     …
}

우선 클 라 이언 트 Id 는 필수 속성 으로 클 라 이언 트 를 유일 하 게 표시 하 는 Id 이 고 클 라 이언 트 시 크 릿 은 클 라 이언 트 보안 코드 를 대표 합 니 다.이 곳 의 Scope 는 클 라 이언 트 의 방문 범 위 를 제한 하 는 데 사 용 됩 니 다.이 속성 이 비어 있 으 면 클 라 이언 트 는 모든 방문 범 위 를 가지 고 있 습 니 다.흔히 볼 수 있 는 설정 방식 은 웹 클 라 이언 트 나 모 바 일 클 라 이언 트 로 각각 웹 엔 드 와 모 바 일 엔 드 를 대표 할 수 있 습 니 다.
마지막 으로 authorized GrantTypes 는 클 라 이언 트 가 사용 할 수 있 는 권한 수여 모델 을 대표 합 니 다.선택 할 수 있 는 범 위 는 권한 수여 코드 모델 을 대표 하 는 authorization 을 포함 합 니 다.code,암시 적 권한 수여 모드 implicit,암호 모드 를 대표 하 는 password 및 클 라 이언 트 증빙 모드 를 대표 하 는 clientcredentials。이 속성 은 설정 에 refresh 를 추가 할 수 있 습 니 다.token,새로 고침 작업 을 통 해 상기 인증 모드 에서 생 성 된 새로운 Token 을 가 져 옵 니 다.
인증 과정 과 유사 하 게 Spring Security 도 AuthorizationServerConfigurerAdapter 라 는 설정 어댑터 클래스 를 제공 하여 설정 클래스 의 사용 방식 을 간소화 합 니 다.이 클래스 를 계승 하고 그 중의 configure(Client Details ServiceConfigurer clients)를 덮어 쓰 는 방법 으로 설정 할 수 있 습 니 다.AuthorizationServerConfigurerAdapter 를 사용 하여 클 라 이언 트 정보 설정 을 하 는 기본 코드 구 조 는 다음 과 같 습 니 다.

@Configuration

public class SpringAuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.inMemory()
        .withClient("spring")
        .secret("{noop}spring_secret")
        .authorizedGrantTypes("refresh_token", "password", "client_credentials")
        .scopes("webclient", "mobileclient");
    }
}

이 를 통 해 저 희 는 SpringAuthorizationServerConfigurer 류 를 만들어 AuthorizationServerConfigurerAdapter 를 계승 하고 Client Details ServiceConfigurer 설정 류 를 통 해 인증 모드 를 암호 모드 로 설정 한 것 을 볼 수 있 습 니 다.권한 수여 서버 에 클 라 이언 트 정 보 를 저장 하 는 방법 은 두 가지 가 있 는데 하 나 는 상기 코드 와 같은 메모리 기반 저장 이 고 다른 하 나 는 JDBC 를 통 해 데이터 베이스 에 상세 한 정 보 를 저장 하 는 것 이다.간단하게 보기 위해 서 메모리 등급 의 저장 방식 을 사용 하 였 다.
동시에 클 라 이언 트 보안 코드 를 설정 할 때"{noop}spring"을 사 용 했 음 을 알 수 있 습 니 다.시 크 릿Spring Security 5 에서 PasswordEncoder 를 통일 적 으로 사용 하여 비밀 번 호 를 인 코딩 하고 비밀 번 호 를 설정 할 때'{id}password'형식 을 요구 하기 때 문 입 니 다.여기 접두사'{noop}'은 구체 적 인 PasswordEncoder 를 대표 하 는 id 로 NoOpPasswordEncoder 를 사용 하고 있 음 을 나타 낸다.
@EnableAuthorizationServer 주 해 는 일련의 단점 을 드 러 내 고 권한 수여 과정 은 AuthorizationEndpoint 라 는 단점 을 사용 하여 제어 합 니 다.이 노드 의 행동 을 설정 하려 면 AuthorizationServerEndpoints Configure 라 는 설정 클래스 를 사용 할 수 있 습 니 다.Client Details ServiceConfigure 설정 클래스 와 마찬가지 로 AuthorizationServerConfigurerAdapter 설정 어댑터 클래스 를 사용 하여 설정 합 니 다.
인증 절 차 를 포함 하 는 인증 모드 를 암호 모드 로 지정 하 였 기 때 문 입 니 다.따라서 AuthorizationServerEndpoints Configurer 설정 류 에 대해 인증 관리자 AuthenticationManager 를 지정 하여 사용자 이름과 비밀 번 호 를 인증 해 야 합 니 다.마찬가지 로 암호 기반 인증 모드 를 지정 하 였 기 때문에 사용자 정의 UserDetailsService 를 지정 하여 전체 구현 을 바 꿔 야 합 니 다.AuthorizationServerEndpoints Configurer 를 다음 코드 로 설정 할 수 있 습 니 다.

@Configuration

public class SpringAuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {

 @Autowired
 private AuthenticationManager authenticationManager;

 @Autowired
 private UserDetailsService userDetailsService;

 @Override

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

이로써 클 라 이언 트 설정 작업 이 모두 완료 되 었 습 니 다.우리 가 하 는 일 은 사용자 정의 SpringAuthorizationServerConfigure 설정 클래스 를 실현 하고 해당 하 는 설정 방법 을 덮어 쓰 는 것 입 니 다.
사용자 인증 정보 설정
사용자 인증 정보 에 의존 하 는 설정 클래스 는 WebSecurity Configurer 클래스 입 니 다.Spring Security 역시 WebSecurity Configurer Adapter 클래스 를 제공 하여 이 설정 클래스 의 사용 방식 을 간소화 합 니 다.저 희 는 WebSecurity Configurer Adapter 클래스 를 계승 하여 configure()를 복사 하 는 방법 으로 설정 작업 을 완성 할 수 있 습 니 다.
웹 보안 Configurer 설정 클래스 에 대해 서 는 먼저 명확 한 설정 내용 이 필요 합 니 다.실제로 사용자 정 보 를 설정 하 는 것 은 매우 간단 합 니 다.사용자 이름(User),비밀번호(Password),캐릭터(Role)세 가지 데이터 만 지정 하면 됩 니 다.다음 과 같 습 니 다.

@Configuration

public class SpringWebSecurityConfigurer extends WebSecurityConfigurerAdapter {

 @Override
 @Bean
 public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
 }

 @Override
 @Bean
 public UserDetailsService userDetailsServiceBean() throws Exception {
            return super.userDetailsServiceBean();
 }

 @Override
 protected void configure(AuthenticationManagerBuilder builder) throws Exception {
 builder
            .inMemoryAuthentication()
            .withUser("user1")
            .password("{noop}password1")
            .roles("USER")
            .and()
            .withUser("admin")
            .password("{noop}password2")
            .roles("USER", "ADMIN");
 }
}

위의 코드 와 결합 하여 우 리 는 서로 다른 역할 과 비밀 번 호 를 가 진 두 사용 자 를 보 았 습 니 다.'user 1'이 대표 하 는 역할 은 일반 사용자 이 고'admin'은 관리자 역할 을 가지 고 있 습 니 다.암 호 를 설정 할 때 도 접두사'{noop}'을 추가 해 야 합 니 다.또한 authentication Manager Bean()과 userDetails ServiceBean()방법 은 각각 부모 클래스 의 기본 구현 을 되 돌려 주 는 것 도 보 았 습 니 다.여기 서 돌아 오 는 UserDetails Service 와 AuthenticationManager 는 앞에서 클 라 이언 트 를 설정 할 때 사 용 됩 니 다.
생 성 토 큰
현재 OAuth 2 인증 서버 가 구축 되 었 습 니 다.이 인증 서버 를 시작 하면 Token 을 가 져 올 수 있 습 니 다.OAuth 2 서버 를 구축 할 때 인증 서버 에 HTTP 요청 에 접근 할 수 있 는 터미널 이 노출 된다 고 언급 했 습 니 다.Token 을 가 져 오 는 터미널 은http://localhost:2000/oauth/token입 니 다.이 터미널 을 사용 할 때 저 희 는 앞에서 설정 한 클 라 이언 트 정보 와 사용자 정 보 를 제공 해 야 합 니 다.
여기 서 Postman 을 사용 하여 HTTP 요청 을 모 의 합 니 다.클 라 이언 트 정보 설정 방식 은 다음 그림 과 같 습 니 다.

"Authorization"요청 헤더 에 인증 형식 을"Basic Auth"로 지정 한 다음 클 라 이언 트 이름과 클 라 이언 트 보안 코드 를 각각"spring"과"spring"으로 설정 합 니 다.secret”。
다음은 권한 수여 모드 에 대한 전용 설정 정 보 를 지정 합 니 다.우선 권한 수여 모드 를 지정 하 는 granttype 속성 과 클 라 이언 트 접근 범 위 를 지정 하 는 scope 속성 입 니 다.여 기 는 각각"password"와"webclient"로 설정 되 어 있 습 니 다.암호 모드 가 설정 되 어 있 으 므 로 사용자 이름과 비밀 번 호 를 지정 하여 사용자 의 신분 을 식별 해 야 합 니 다.여기 서 저 희 는'spring'으로user'라 는 사용 자 를 예 로 들 어 설정 합 니 다.다음 그림 과 같 습 니 다.

Postman 에서 이 요청 을 실행 하면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.

{
    "access_token":"d2066f68-665b-4038-9dbe-5dd1035e75a0",
    "token_type":"bearer",
    "refresh_token":"44009836-731c-4e6a-9cc3-274ce3af8c6b",
    "expires_in":3599,
    "scope":"all"
}

요청 매개 변수 인 scope 를 제외 하고 이 반환 결과 에는 access 가 포함 되 어 있 음 을 알 수 있 습 니 다.token、token_type、refresh_token 과 expiresin 등 속성.이 속성 들 은 모두 매우 중요 하 다.물론 매번 생 성 을 요청 하 는 Token 이 유일한 것 이기 때문에 시도 할 때 얻 은 결 과 는 저 와 다 를 수 있 습 니 다.
자바 가 OAuth 2 인증 서버 를 구축 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 가 OAuth 2 인증 서버 를 구축 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기