Spring Boot

Spring Boot OAuth 구글 로그인

박도치 2023. 6. 7. 14:37

웹 페이지들을 보면 일반적인 회원가입과 로그인이 있지만, 간편하게 이용할 수 있는 구글 로그인, 카카오 로그인 등 oauth로그인이 존재한다.

 

이는 각 개발자 플랫폼에서 api를 통해 간편 로그인을 만들어 줄 수 있는데 대표적으로 구글 로그인에 대해서 알아보도록 하자.

 

Google Api Key 생성방법

 

먼저 구글 개발자 플랫폼으로 이동하자

 

https://console.cloud.google.com/cloud-resource-manager

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

 

처음 생성한다면 위와 같이 비어있으니 프로젝트 만들기를 눌러 새로 생성해주도록 하자

 

프로젝트 이름은 각자 알아서 지어주고 그대로 만들기를 누르면 된다.

 

프로젝트를 생성했다면 좌측 메뉴를 클릭하여 API 및 서비스 메뉴의 OAuth 동의 화면을 클릭해준다.

 

먼저 상단에서 생성한 프로젝트가 맞는지 확인한 후 User Type은 외부를 체크해주고 만들기를 눌러준다.

 

앱 이름도 마찬가지로 각자 지어주면 되고 * 표시되어있는 필수 입력란(이메일)도 각자 이메일을 입력해주면 된다.

 

그리고 사용자 인증정보 메뉴로 와서 사용자 인증정보 만들기를 누른 후 OAuth 클라이언트 ID메뉴탭을 눌러주자

승인된 리디렉션 URI는 우리가 구글 로그인을 하게 되면 구글 서버쪽에서 우리쪽으로 인증이 되었다는 코드를 돌려준다. 

 

그러면 우리는 그 코드를 받아서 이 코드를 통해 액세스 토큰을 받고, 액세스 토큰을 통해 사용자의 정보에 접근할 수 있는 

 

권한이 생긴다.

 

http://localhost:8000 주소 까지는 각자 포트에 맞춰서 하면 되지만 뒤에 따라오는 URI는 oauth라이브러리를 사용하게 되

 

면 고정적으로 사용되는 URI이다. 

 

그리고 해당 주소로 이동하는 controller도 만들 필요가 없는게 알아서 제어해주기 때문에 GetMapping하지 않아도 된다.

 

만들기를 하게되면 이렇게 클라이언트 ID와 비밀번호가 생성되게 된다.

 

OAuth 라이브러리 설치

oauth라이브러리를 설치해주도록 하자

<!-- spring-boot-starter-oauth2-client -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>

 

설치를 했다면 application.yml로 가서 아래와 같이 입력해주도록 하자

 

spring:
 security:
    oauth2:
      client:
        registration:
          google:
            client-id: '구글 클라이언트 아이디'
            client-secret: '구글 클라이언트 보안 비밀번호'
            scope:
            - email
            - profile

 

그리고 templates에 loginForm.html에서 구글 로그인 버튼을 하나 생성해주도록 하자

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 페이지</title>
</head>
<body>
<h1>로그인페이지</h1>
<hr/>
<form action="/login" method="POST">
	<input type="text" name="username" placeholder="Username"><br/>
	<input type="password" name="password" placeholder="Password"><br/>
	<button>로그인</button>
</form>
<a href="/oauth2/authorization/google">구글 로그인</a>
<a href="/joinForm">회원가입을 아직 하지않으셨나요?</a>	
</body>
</html>

 

loginForm 페이지

 

위와 같이 구글로그인 버튼이 생기는데, 클릭하게 되면 404가 뜰것이다. 이유는 SecurityFilterChain에서 설정해야하는데 

 

하지않아서이다.

 

이전에 만들었던 SecurityConfig로 가서 oauth2Login()을 build해주면 해결된다.

 

SecurityConfig

 

@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터 체인에 등록됨
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) //secured 어노테이션 활성화, preAuthorize 어노테이션 활성화
public class SecurityConfig {

	@Bean
	public SecurityFilterChain filter(HttpSecurity http) throws Exception {
		http.csrf().disable()
			.authorizeRequests()
            .antMatchers("/user/**").authenticated()
            .antMatchers("/manager/**").access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')") //hasRole 은 풀네임을 써줘야 하지만, hasAuthority는 앞에 ROLE_ 이 붙기 때문에 
            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")// hasRole("ROLE_ADMIN") == hasAuthority("ADMIN") 이다.
            .anyRequest().permitAll()// 권한 설정, 해당페이지(antMatchers) 설정한 곳은 권한(hasAuthority)이 있어야 들어갈 수 있다.
            
            .and()

            .formLogin() //formLogin 형태
            .loginPage("/loginForm") //loginpage를 낚아챔
            .loginProcessingUrl("/login") // 시큐리티가 /login주소를 대신 낚아채주기 때문에 컨트롤러에 /login을 만들지 않아도됨
            .defaultSuccessUrl("/")// 로그인 이후에 이동할 페이지
            
            .and()
            
            .oauth2Login()
            .loginPage("/loginForm");
            
            
		return http.build();
	}
	
}

 

build 해준 후 클라이언트로가서 다시 구글 로그인 버튼을 누르면 아래와 같이 뜨며 구글 로그인에 성공하게 된다.