> Hello World !!!

     

@syaku

Spring Security OAuth - Client Credentials 인증 방식

https://github.com/syakuis/spring-security-oauth

코드를 함께 보면서 작업하시면 도움이 됩니다.

목차


ClientId 와 ClientSecret 으로 액세스 토큰을 발급받을 수 있다. 작업 흐름도 매우 심플하다. 보안적으로 취약할 수 있으며 ClientSecret 이 유출되지 않도록 주의해야 한다.

서버대 서버 통신시 인증 방식으로 사용할 수 있으며 장비 애플리케이션과의 통신을 위한 인증 방식으로도 사용할 수 있으나 폐쇄망에서만 사용하는 것을 권장한다.

refresh token 을 제공하지 않으며 Client 정보를 기반으로 하므로 사용자 정보를 제공하지 않는 다.

작업 흐름

애플리케이션에 액세스 토큰 요청을 직접 구현하지 않고 모든 애플리케이션은 BFF로 통하게 하여 BFF에 액세스 토큰을 발급받을 수 있도록 구현하는 것이 효과적일 수 있다.

요청 예시

POST /oauth/token?grant_type=client_credentials
Authorization: Basic ClientId ClientSecret

테스트 코드

@ExtendWith(SpringExtension.class)
@SpringBootTest
@AutoConfigureMockMvc
class ClientCredentialsRestControllerTest {
    @Autowired
    private MockMvc mvc;

    @Autowired
    private TestProperties props;

    private String clientId;
    private String clientSecret;

    @BeforeEach
    void init() {
        clientId = props.getClientId();
        clientSecret = props.getClientSecret();
    }

    @Test
    void accessToken() throws Exception {
        mvc.perform(post("/oauth/token")
                .param("grant_type", GrantType.CLIENT_CREDENTIALS.getValue())
                .with(httpBasic(clientId, clientSecret))
            )
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.access_token").isNotEmpty())
            .andExpect(jsonPath("$.uid").doesNotExist())
            .andExpect(jsonPath("$.name").doesNotExist())
            .andDo(print())
        ;
    }
}