[Spring boot] Spring boot Security를 이용한 OAuth2 인증 구현 1 - Google 계정 인증

지난 포스트에 이어서, 오늘은 새로운 프로젝트를 생성하여 Spring boot Security 디펜던시를 이용해 OAuth2 인증을 구현하는 시간을 가져보고자 합니다.

 

지난 포스트에서 OAuth2 인증을 구현하기 위해 인증 토큰과 액세스 권한을 얻는 방법에 대해 알아봤습니다. 클라이언트에서 권한 서버를 통해 권한을 확인하고, 부여 받은 ID와 Secret를 이용하여 토큰을 받는 방식이었죠.

 

이를 토대로 Spring boot security를 이용하여 회원 가입과 인증을 동시에 어떻게 구현할 수 있는지 지금부터 살펴보도록 하겠습니다. 이 포스트는 기본 애플리케이션으로 하여금, OAuth2 로그인부터 User Entity 연동까지 다룰 것이며 이번에 다룰 것은 기본적인 Spring boot security 설정 방법과 간단한 OAuth2 인증만을 다룰 것입니다.

 

 

 

새로운 프로젝트 생성

먼저 새로운 프로젝트를 생성해보겠습니다. 이번 포스트에서는 Spring boot rest가 아닌 Spring MVC로 진행해보고자 합니다. 따라서 View를 지원해줄 템플릿인 thymeleaf와 OAuth2 client를 Spring boot 기본 디펜던시와 함께 추가해주도록 합시다.

이번 포스트에서는 H2 Database를 이용해서 사용자 인증을 다룰 것입니다. 따라서 위 이미지에 H2 Database를 같이 눌러주도록 합시다.

 

 

 

Spring boot Security 2.x and OAuth2 Client

스프링 시큐리티를 다루기 전에 먼저 스프링 부트 시큐리티 2.0에 대해서 잠시 설명을 드리고자 합니다. 본래 사용했던 스프링 부트 시큐리티 1.x 버전에서는 OAuth2 구현을 위해서 Filter, Handling 등을 모두 수동으로 설정하고, 이를 NestedProperties 등을 활용하여 작성해야 했습니다.

 

그러나 Spring boot security 2.0에서는 기본적으로 Google과 Facebook의 OAuth2 인증이 구현되어 있습니다. 우리는 이를 이용하면 Google과 Facebook에 대해서는 쉽게 OAuth2 인증을 구현할 수 있습니다.

 

그럼 이제 본격적으로 코드를 다뤄보도록 하죠.

 

 

 

Spring boot Security Configuration

먼저 해야할 것은 애플리케이션의 보안을 적용하는 것입니다. Spring boot security가 없다면, 각 API 포인트별로 Filter 혹은 Intercepter를 이용하여 API 요청 전후로 AOP를 적용해 인증 단계를 검토해야 할 것입니다.

 

그러나 Spring boot Security를 이용하면 어노테이션 하나를 이용해서 각 엔드포인트의 접근을 제한할 수 있습니다.

Configuration 어노테이션은 Spring boot와 마찬가지로 애플리케이션 실행시, 로드되며 여기에 EnableWebSecurity를 사용하면 모든 엔드포인트에 접근 제한이 걸리게 됩니다. 이 때부터 모든 엔드포인트는 아래의 WebSecurityConfigurerAdapter 클래스의 configure 콜백 함수에 정의된 대로 동작하게 됩니다.

permitAll 메소드를 이용하게 되면, 앞에 매칭된 엔드포인트들은 별다른 권한 없이 Anonymous로 접근할 수 있도록 하게 됩니다. 즉, 모든 사용자가 접근할 수 있도록 하는 것이죠. 기본적으로 MVC에서 주로 사용되는 이미지나 스타일시트, 파비콘, 자바스크립트 등이 이에 해당되며, 접근 권한을 받을 수 있는 Login 페이지도 여기에 포함되어야겠죠?

나머지 EndPoint에 대해서는 인증되어야만 사용할 수 있도록  authenticated 메소드를 사용해주고, Spring security에서 제공하는 oauth2Login 메소드를 이용하여 로그인 코드를 가져오도록 합니다. 마지막으로 인증이 진행되지 않은 상태에서 페이지에 접근할 경우, 자동으로 login 페이지로 리다이렉트 되도록 authenticationEntryPoint 메소드에 URL을 /login으로 맞춰줍니다.

 

이것으로 Security 관련 설정은 모두 끝났습니다. 엇 아직, Client ID랑 Secret을 주지 않았는데요. 그리고 권한 서버랑 토큰 서버랑 연결도 시켜야 하는데, 이런 부분은 구현하지 않는군요. 

 

본래는 구현해야 하는 것이 맞지만 Spring boot security에 위 부분이 전부 구현된 상태이고 우리는 이제 Client ID와 Client Secret만을 넣어주면 됩니다. 

 

 

 

Generate Google Client

Google OAuth2 인증을 사용하기 위한 Client ID와 Secret은 Google Cloud Platform Console 사이트에서 받을 수 있습니다. 

 

https://console.cloud.google.com/

 

Google Cloud Platform

하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요.

accounts.google.com

위 사이트를 클릭하여 진행할 수 있습니다.

 

만약 기존 프로젝트가 없다면, 프로젝트를 새로 생성해야 하는데, 적당한 프로젝트 이름을 입력한 후, 만들기를 눌러서 진행하면 됩니다.

 

 

페이지 상단에서 OAuth client ID 만들기를 누른 후, Client ID 만들기를 진행합니다.

 

애플리케이션 타입을 Web Application으로 선택하고, 앱 이름을 정해줍니다. 그리고, Spring boot 내에 있는 Embedded Tomcat의 기본 포트 주소와 함께 URL을 입력해줍니다.

 

마지막으로 Redirect URI가 있는데, 이 주소는 애플리케이션에서 Google 로그인으로 리다이렉트 되도록 설정된 URL을 입력하는 란입니다. Spring boot security에서 제공하는 OAuth2 Login 주소는 oauth2/** 로 시작하며 이 뒤에 code와 google을 붙여주면 Google 로그인으로 리다이렉트 됩니다.

 

여기까지 끝났다면 Client ID와 Client Secret을 받을 수 있습니다. 이제 애플리케이션에 ID와 Secret을 주입하면 됩니다.

Spring boot Security에서 Google OAuth2를 사용하기 위해 위와 같이 spring.security.oauth2.client.registration.google 하위에서 ID와 Secret을 정해주면 끝입니다.

 

 

 

 

Thymeleaf를 이용한 페이지 구현

이제 페이지를 구현할 차례입니다. 페이지는 간단하게 메인 페이지(HOME)과 로그인 페이지(LOGIN) 그리고, 로그인이 하고 들어갈 수 있는 board 페이지 하나를 임의로 만들어보도록 하겠습니다.

 

Spring boot에서는 여러가지 View를 사용할 수 있는데, 대표적인 것이 JSP/JSTL, Thymeleaf, Velocity 등이 있습니다. 여기서 우리는 Thymeleaf를 사용할 것이며 Spring boot starter에서 제공하는 ViewResolver에 의거 Thymeleaf는 resources/templates 밑에 HTML 페이지를 읽게 됩니다. 나머지 image, css 등은 static 폴더로 가면 됩니다.

Home, Login, Board 이렇게 3가지를 만들었으며, 처음에는 Home에 있다가, 게시판을 눌렀을 때, 인증 정보가 없으면 로그인을 해야하고, 로그인이 되면 게시판으로 이동할 수 있도록 구현합니다.

 

 

 

Controller 구현

Spring boot에서 REST API를 구현했을 때는 RestController를 이용했습니다. 그러나 View를 구현할 때는 Controller 어노테이션을 이용합니다. 

페이지를 반환할 때는 html 파일 이름을 문자열로 반환하면 됩니다.

 

 

 

Test

서버를 실행한 후, 메인 페이지에 접속해봅니다. 

 

위 상태에서 Board를 들어가게 되면, 로그인 페이지가 나오게 됩니다. 

 

Google 로그인을 처음 진행하면, 다시 Home으로 돌아가게 되고, 기존에 진행한 이력이 있다면 바로 게시판이 나오게 됩니다. 

 

 

 

 

마치며...

기존의 User Entity 없이 Google 계정만을 다뤄봤습니다. Spring Security에서 제공하는 Provider 덕분에 OAuth2 인증 단계에서 권한 서버와 토큰 서버에 ID와 Secret을 수동으로 HTTP API를 요청하는 코드를 구현하지 않아도 된다는 점은 굉장히 편한 부분이네요.

 

다음 포스트에서는 User Entity와 연동하여 로그인을 구현해보도록 하겠습니다.

 

comments powered by Disqus

Tistory Comments 0