Spring Boot와 Spring Security, OAuth2를 이용해서, Google 인증을 통한 SSO 인증 예제를 만들어보자.
아래 예제는 https://www.programmergate.com/spring-boot-spring-security-oauth2/ 를 참조하였다.
사용 기술
▶Maven4
▶ Java 1.8
▶ Spring Boot 2.0.0
▶ STS 3.9.5.RELEASE
1. Maven Project 생성
New -> Maven Project
workspace 위치를 확인하고, Next를 클릭한다.
우리가 만드는 것은 web application이므로, Artifact Id가 maven-archetype-webapp 인 것을 선택한다. 나머지 옵션은 그대로 두자.
Group ID와 Artifact Id에 원하는 명칭을 적고 Finish를 클릭하자.
위 절차를 마무리하면, 아래와 같은 프로젝트가 생성된다.
2. pom.xml 설정
pom.xml 파일을 열어서, compiler를 1.8로 설정해준다.
그리고, spring security, Oauth2를 추가해준다. 아래는 설정한 pom.xml 파일이다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.augustine</groupId>
<artifactId>springauth</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>springauth Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>springauth</finalName>
</build>
</project>
혹시, project에 에러 표시가 있다면, Maven -> Update Project 를 통해 라이브러리를 새로 내려받도록 하자.
3. webapp 의 인증(credentials) 만들기
먼저, OAuth2를 애플리케이션에 적용하기 위해 해야 할 것은, Google Cloud Platform 에서 인증용 GOOGLE API를 신청해야 한다.
아래 절차대로 진행하자.
1) https://console.cloud.google.com/ 에 접속
2) Project 생성
새 프로젝트를 눌러, 프로젝트 이름을 선택해서 만든다.
3) API 및 서비스 -> 사용자 인증 정보를 선택한다.
OAuth 클라이언트 ID를 선택한다.
4) 애플리케이션 유형을 선택한다. 우리가 만드는 것은 웹 애플리키에션이기에, 웹 애플리케이션을 선택한다.
처음에 애플리케이션 유형을 선택하는 라디오 버튼이 비활성화 되어 있다. OAuth 클라이언트 이름을 입력한 후, 유형을 선택할 수 있으니 참고하자.
5) 승인된 리디렉션 URI에 Google 인증 후, Redirect 될 주소를 적어준다. 우리는 아래와 같은 주소를 적어준다.
4. application.properties 만들기
서버정보와 OAuth2 정보를 application.properties에서 설정한다.
server.port=7080
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.error.whitelabel.enabled=false
security.oauth2.client.clientId=Google api 의 client ID를 입력한다.(아래그림참조)
security.oauth2.client.clientSecret=Google api 의 클라이언트 보안 비밀 번호를 입력한다.(아래그림참조)
security.oauth2.client.preEstablishedRedirectUri=http://localhost:7080/callback #인증을 수행할 action uri
security.oauth2.client.accessTokenUri=https://www.googleapis.com/oauth2/v3/token
security.oauth2.client.userAuthorizationUri=https://accounts.google.com/o/oauth2/auth
security.oauth2.client.tokenName=oauth_token
security.oauth2.client.authenticationScheme=query
security.oauth2.client.clientAuthenticationScheme=form
security.oauth2.client.scope=profile
security.oauth2.resource.user-info-uri=https://www.googleapis.com/userinfo/v2/me
security.oauth2.client.useCurrentUri=false
5. View page 만들기
VIew page가 필요하다. 하나는 초기 화면인 index page와 인증 후인 home page 다.
아래 두 파일을 WEB-INF 밑에 jsp 폴더를 만들어 저장하자.
index.jsp
<!DOCTYPE html>
home.jsp
<!DOCTYPE html>
package com.augustine.springauth; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableOAuth2Sso public class ApplicationSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/**") .authorizeRequests() .antMatchers("/", "/callback", "/login**", "/webjars/**", "/error**") .permitAll() .anyRequest() .authenticated(); } }
7. Controller 만들기
Client 의 request를 처리할 Controller를 만들자. 특별한건 없이 매우 심플하게 만들자.
package com.augustine.springauth; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HomeController { @RequestMapping("/") public String login() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); System.out.println(auth.getPrincipal()); return "/index"; } @RequestMapping("/callback") public String callback() { System.out.println("redirecting to home page"); return "/home"; } }
8. Application.java 만들기
Spring Boot 를 구동할 Application 클래스를 만들자. 우리가 만든 Spring Boot Application을 구동하려면 @SpringBootApplication 이 필요하다.
package com.augustine.springauth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application{ public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
9. Test
톰캣을 구동 후, http://localhost:7080 으로 접속한다. Login with Google을 클릭하면, 구글 인증 창이 나온다.
인증이 성공하면, 우리가 설정한 home.page로 이동할 것이다.
'Tech > Spring' 카테고리의 다른 글
2. Spring RabbitMQ (0) | 2020.02.11 |
---|---|
1. Spring AMQP (0) | 2020.02.11 |
Spring Boot & H2 DB 를 이용한 CRUD 구현 - 1 (1) | 2019.09.08 |
JPA와 mybatis 병행을 위한 설정 (0) | 2018.10.19 |
Maven - 부모, 자식 POM 예제 (0) | 2018.07.04 |
댓글