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

2019. 5. 4. 12:35Web/Spring Security&OAuth

 

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

 

 

Spring Security OAuth2.0 파헤치기!(Authorization Server)

내부 챗봇 솔루션을 개발하면서, OAuth2.0을 이용하여 자체 인증서버를 구축할 일이 생겼다. 최근에 웹 또는 앱을 보면서 자주 접하게 되는 인증 방식이 OAuth2.0 방식이다. 대표적으로 네아로(네이버 아이디로..

coding-start.tistory.com

 

 

Spring Security OAuth2.0 파헤치기!(Authorization Server + Resource Server)

오늘은 이전 포스팅에서 다 마치지 못했던 Authorization Server와 나머지 Resource Server,Client 애플리케이션에 대해 포스팅 할 것이다. 사실 대부분 소스설명은 생략하였다. 사실 소스 설명이라고 할건 Sprin..

coding-start.tistory.com

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

<깃헙 주소>

 

yoonyeoseong/spring-oauth2.0

Contribute to yoonyeoseong/spring-oauth2.0 development by creating an account on GitHub.

github.com

<Git Repository>

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

 

 

 

메이븐 멀티프로젝트(maven multi module) & SVN

maven multi module project 만드는 방법과 해당 프로젝트를 SVN에 올리고 다른 개발환경에서 checkout하는 방법 모든 환경은 Mac OS 환경입니다. 오늘 설명 할것은 maven multi module project를 만드는 방법과..

coding-start.tistory.com

 

 

Spring boot - Maven Multi Module project 만들기

오늘 다루어볼 포스팅 내용은 Maven Multi Module을 이용한 Spring Boot Project 만들기입니다. 우선 Maven Multi Module 프로젝트란 하나의 부모 Maven Project를 생성하고 그 밑으로 자식 Maven Module들을 가..

coding-start.tistory.com

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@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");
    }
    
}
cs

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에 글을 남겨주길 꼭 부탁드린다.