
오늘의 목표 :
Spring Security OAuth 2 설정: 인증 서버 설정, 리소스 서버 설정
오늘의 목차 :
1. Spring Security OAuth 2 설정: 인증 서버 설정
2. 리소스 서버 설정
3. Test코드 수정 Get 요청을 제외한 모든 요청에 엑세스 토큰을 포함하여 요청

(spring-security-test 를 위한 의존성 주입)



AuthorizationServerConfigurerAdapter 클래스의 메서드를 재정의하여 서버의 설정을 구성
1. OAuth2 인증 서버의 보안 설정 : passwordEncoder를 사용하여 비밀번호를 암호화 한다.
2. 클라이언트 정보 구성 : inMemory 방식으로 클라이언트 정보를 저장하고, myApp이라는 클라이언트를 설정, password와 refresh_token을 사용하여 인증을 허용하며, read와 write라는 스코프를 가지도록 설정했다. 또한 클라이언트의 암호를 인코딩하기 위해 passwordEncoder를 사용한다.
3. 인증 서버의 엔드포인트 : authenticationManager를 설정하여 사용자의 인증을 관리하고, accountService를 사용하여 사용자의 상세 정보를 검색하며, tokenStore를 사용하여 토큰을 저장한다.
이렇게 설정된 OAuth2 인증 서버는 클라이언트에게 인증된 사용자의 액세스 토큰과 리프레시 토큰을 발급하고, 클라이언트의 요청에 따라 토큰을 검증하고 엑세스를 제어한다.

외부 요청에 인증을 하는 리소스에 접근을 할 때, OAuth 서버에서 제공하는 토큰 서비스에 요청을 보내서 토큰을 가지고 요청하도록 리소스 서버를 설정
토큰을 발급받는 과정은 클라이언트가 해야하는 일이고, 리소스 서버는 토큰 기반으로 인증 정보가 있는지 없는지 확인해서 접근 제한을 한다.

ResourceServerConfigurerAdapter 클래스의 메서드를 재정의하여 리소스 서버의 설정을 구성
1. 소스 서버의 보안 설정 : resourceId() 메서드를 사용하여 리소스 서버의 식별자를 설정한다. 이 식별자는 인가 서버에서 클라이언트가 액세스할 수 있는 리소스를 식별하는 데 사용된다.
2. HTTP 보안 설정 및 리소스에 대한 액세스 규칙 :
anonymous(): 익명 사용자에 대한 액세스를 허용합니다.authorizeRequests(): 요청에 대한 인가 규칙을 정의합니다.mvcMatchers(HttpMethod.GET, "/api/**").permitAll(): GET 메서드로 /api/** 패턴에 대한 요청은 인증 없이 허용됩니다.anyRequest().authenticated(): 다른 모든 요청은 인증된 사용자에게만 허용됩니다.exceptionHandling(): 예외 처리를 구성합니다.accessDeniedHandler(new OAuth2AccessDeniedHandler()): 액세스 거부 핸들러를 설정하여 OAuth2 액세스 거부 시 동작을 정의합니다.이렇게 설정된 OAuth2 리소스 서버는 클라이언트로부터 요청을 받아들이고, 해당 요청에 대해 인가 규칙을 적용하여 액세스를 제어합니다. 설정된 액세스 규칙에 따라 인증된 사용자에게는 요청이 허용되고, 그렇지 않은 경우에는 거부된다.
Spring Security 설정을 추가함에 따라 GET 요청을 제외한 모든 요청에는 액세스 토큰을 포함하여 요청해야 하고. 액세스 토큰을 가지고 있지 않은 요청은 인증되지 않은 요청으로 간주되어 액세스가 거부될 것이다.

성공한 Test 들을 보면 Get요청을 하는 Event 조회관련 테스트 들이고 나머지 Test 들은 실패하는 것을 볼 수 있다.

Resource Owner Password Credentials Grant를 사용하여 사용자의 인증 정보를 이용하여 액세스 토큰얻을 수 있도록 작성
1. Basic 인증 헤더에 클라이언트 ID와 시크릿을 포함시킨다.
2. 사용자의 이메일, 비밀번호, 그랜트 타입을 파라미터로 전달하여 Post 요청으로 /oauth/token endPoint 에 액세스 토큰을 요청한다.
3. 응답으로 받은 JSON 데이터에서 액세스 토큰을 추출하여 반환한다.
4. 반환받은 액세스 토큰을 Bearer 토큰 형식으로 반환
5. 인증이 필요한 리소스에 접근할 때 Authorization 헤더에 포함하여 요청에 사용한다.


인증이 필요한 요청들이 인증을 요청할 때 Authorization 헤더에 Bearer 토큰추가하여 요청 시 Test 가 성공하는 것을 볼 수 있다.