본문 바로가기
Tech/Spring

Spring Boot + Spring Security + OAuth2 을 이용한 Google SSO인증

by Augustine™ 2018. 10. 29.
반응형

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>

<html>
<head>
</head>
<body>
     <a href="/login">Login with Google</a>
</body>
</html>


home.jsp

<!DOCTYPE html>

<html>
<head>
</head>
<body>
      <h1>Congratulations !! You're authorized, this is the home page</h1>
</body>
</html>


6. Application Security 설정

Spring Security는 비인가된 사용자들의 모든 페이지에 대한 접속을 허용하지 않는다. 하지만, 인증 전의 초기 페이지인 index.jsp 페이지는 접속해야 하기에 해당 페이지의 예외를 위해서, WebSecurityConfigurerAdapter 클래스를 상속받은 ApplicationSecurity 클래스를 만들어서, configure 메소드를 다음과 같이 override 한다.
@EnableOAuth2Sso 어노테이션은 필수 어노테이션으로서, OAuth2의 초기화와 자동설정을 지원한다. 해당 어노테이션은 Spring Boot의 설정 클래스(@Configuration)에서 같이 사용할 수 있다.
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

댓글