Spring Security OAuth2.0 파헤치기! - 3(authorization server + resource server + client)

2021. 4. 13. 13:12 Spring Framework/Spring security

 

오늘 포스팅은 길지 않은 포스팅이 될 것같다. 오늘 포스팅할 내용은 이전 OAuth2.0 Authorization Server,Resource Server에 대하여 포스팅했던 내용에 Client 애플리케이션 소스코드를 추가한 최종 소스를 예제로 넣은 포스팅이다. 이전 포스팅들과 조금 달라진 소스가 있지만 아마 그대로 받아서 사용하면 간단한 OAuth2.0(Authorization Code Grant) 플로우를 테스트 해볼 수 있다. 혹시나 이전 포스팅을 보지 못했다면 밑 링크를 참고하자.

 

[Spring Framework/Spring security] - Spring Security OAuth2.0 파헤치기! - 1(Authorization Server)

 

[Spring Framework/Spring security] - Spring Security OAuth2.0 파헤치기! - 2(Authorization Server + Resource Server)

 

오늘은 소스를 GitHub에 모두 업로드 해놓았다. 프로젝트의 구조에 대하여 조금 설명하자면, 전체 프로젝트 구성은 Maven Multi Module 프로젝트로 구성되어있다. 

<깃헙 주소>

github.com/levi-yo/spring-oauth2.0

 

<Git Repository>

authorizationserver module은 인증서버를, resourceserver는 리소스서버,client는 클라이언트 애플리케이션 프로젝트이다. common은 공통적으로 사용할 소스코드를 위한 모듈이지만 아마 아무것도 들어가있지 않을 것이다. 추후에 이 소스를 활용한다면 사용할 수도 있을 모듈이다.(공통적인 DB 액세스 클래스등) sql 폴더는 필요한 Oracle DB schema가 있다. 혹시나 메이븐 멀티 모듈 프로젝트를 잘모른다면 이전 포스팅들중 메이븐 멀티모듈 프로젝트에 대한 포스팅을 참고하자.

 

coding-start.tistory.com/59

 

coding-start.tistory.com/162

 

내가 작성한 프로젝트들을 어느 다른 OAuth2.0 포스팅들처럼 PostMan 같은 툴을 사용하지 않는다. 왜냐하면 클라이언트 애플리케이션이 존재하기 때문에 직접 인증코드를 받고 액세스 토큰을 받을 일이 없기때문이다. 만약 직접 인증 코드와 액세스 토큰을 받는 플로우 테스트를 하고 싶다면 직접 툴을 이용해 Authorization Server와 Resource Server에게 요청을 보내보자. 소스 코드 중에서 하나 중요하게 집고 넘어갈 것이 하나 있다. 바로 클라이언트 프로젝트 소스코드이다.

 

@SpringBootApplication
public class ClientApplication  implements CommandLineRunner, ServletContextInitializer
{
    
    @Autowired private ResourceOwnerRepository repository;
    @Autowired private PasswordEncoder passwordEncoder;
    
    public static void main( String[] args )
    {
        SpringApplication.run(ClientApplication.class, args);
    }
    
    @Override
    public void run(String... args) throws Exception {
        
        ResourceOwner user = new ResourceOwner();
        user.setId(1l);
        user.setUsername("1223yys@naver.com");
        user.setPassword(passwordEncoder.encode("password"));
        user.setRole(UserRole.ROLE_USER);
        
        repository.save(user);
        
    }
 
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.getSessionCookieConfig().setName("clientsession");
    }
    
}

 

ServletContextInitializer를 구현하고 있는 부분이다. 메소드를 보면 HttpSession을 위한 Cookie 이름을 바꿔서 사용하고 있다. 그 이유는 우리는 Authorization Server와 Client 애플리케이션을 같은 localhost로 사용하고 있다. 그런데 두 애플리케이션 모두 HttpSession을 Security에서 사용하고 있다. 즉, 둘다 HttpSession을 위한 쿠키이름을 같은 걸 사용하면 계속 덮어쓰게 될 것임으로 Client애플리케이션의 쿠키이름을 바꾼것이다. 만약 추후 별도의 도메인을 갖는다면 해당 설정을 필요없다.

 

모든 프로젝트를 실행시켰다면 http://localhost:9000/ 로 접속하자 그러면 아마 클라이언트 애플리케이션의 화면이 하나 나올 것이고, 보호된 리소스를 사용하는 대시보드로 이동하는 링크가 하나 존재할 것이다. 클릭 이후 대시보드로 이동하며 OAuth2.0에 필요한 모든 과정을 OAuth2RestTemplate이 담당해준다. 모든 인증과 액세스 토큰 발급이 완료되면 Client 애플리케이션의 User DB스키마에는 액세스 토큰이 저장되어 있을 것이다. 그리고 해당 토큰을 이용해 Resource Server의 API를 사용하게 되는 것이다.

 

혹시나 해당 프로젝트 분석 중 궁금한 부분이나 잘못된 부분이 있다면 댓글 혹은 Git Issue에 글을 남겨주길 꼭 부탁드린다.



출처: https://coding-start.tistory.com/163?category=869723 [코딩스타트]