로그인 기능을 구현할 때 항상 단순히 문자열이 일치하는지만 확인하는 것으로 개발했었다.
최근 SNS 로그인을통해 기능을 구현해 보고 싶어 SpringBoot와 OAuth2.0를 연동하여 구현하고자 한다.
Spring Initializr를 사용하여 프로젝트 생성
- 프로젝트메타데이터
Project: Maven
Language: Java
Spring Boot: 3.3.2
Group: com.example
Artifact: demo
Name: demo
Packaging: War
Java: 17- Dependencies
Spring Web
Spring security
Spirng oauth2 client
MyBatis Framework
Oracle Driver (ojdbc8)
Lombok
spring.application.name=security
server.port = 9090
spring.mvc.view.prefix=/WEB-INF/jsp/view/
spring.mvc.view.suffix=.jsp
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=cinplus
spring.datasource.password=0000
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath:mapper/**/*.xml
spring.profiles.include=oauth
#google login
spring.security.oauth2.client.registration.google.client-id=
spring.security.oauth2.client.registration.google.client-secret=
spring.security.oauth2.client.registration.google.scope=profile,email
#naver login
spring.security.oauth2.client.registration.naver.client-id=
spring.security.oauth2.client.registration.naver.client-secret=
spring.security.oauth2.client.registration.naver.scope=name,email
spring.security.oauth2.client.registration.naver.client-name=Naver
spring.security.oauth2.client.registration.naver.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.naver.redirect-uri=http://localhost:9090/login/oauth2/code/naver
#naver OAuth2 provider
spring.security.oauth2.client.provider.naver.authorization-uri=https://nid.naver.com/oauth2.0/authorize
spring.security.oauth2.client.provider.naver.token-uri=https://nid.naver.com/oauth2.0/token
spring.security.oauth2.client.provider.naver.user-info-uri=https://openapi.naver.com/v1/nid/me
spring.security.oauth2.client.provider.naver.user-name-attribute=response

package com.example.security.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import lombok.RequiredArgsConstructor;
import com.example.security.oauth.PrincipalOauth2UserService;
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
@RequiredArgsConstructor
public class SecurityConfig {
private final PrincipalOauth2UserService principalOauth2UserService;
private final CorsConfig corsConfig;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http.csrf(AbstractHttpConfigurer::disable);
http.addFilter(corsConfig.corsFilter());
http.authorizeHttpRequests(au -> au.anyRequest().permitAll());
http.oauth2Login(
oauth -> oauth.loginPage("/loginForm")
.defaultSuccessUrl("/home")
.userInfoEndpoint(configurer -> {
configurer.userService(principalOauth2UserService);
})
);
return http.build();
}
}
@Secured("ROLE_ADMIN") //
@GetMapping("/info")
public @ResponseBody String info() {
return "개인정보";
}
이런 식으로 컨트롤러의 함수에 @Secured 애노테이션을 붙여주면, 애노테이션에 인자로 받은 권한이 유저에게 있을 때만 실행하도록 할 수 있음
https://velog.io/@juice/Springboot-Security-%EA%B5%AC%EA%B8%80-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84
https://velog.io/@shon5544/Spring-Security-4.-%EA%B6%8C%ED%95%9C-%EC%B2%98%EB%A6%AC