Spring MVC에 Spring Security를 사용하여 소셜 로그인을 구현해 봅니다.
<!-- Spring Security -->
<dependencies>
<!-- Spring Security -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.7.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.7.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.7.2</version>
</dependency>
</dependencies>
/WEB-INF/spring/security-context.xml을 생성한 후 아래 Bean을 등록합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<http auto-config="true" use-expressions="true">
<!-- 접근 허용할 URL 설정 -->
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/user/login" access="permitAll" />
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/user/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/**" access="isAuthenticated()" />
<!-- 로그인 폼 설정 -->
<form-login
login-page="/user/login"
default-target-url="/"
authentication-failure-url="/user/login?error=true"
/>
<!-- 로그아웃 설정 -->
<logout logout-success-url="/user/login?logout=true" />
</http>
</beans:beans>
Security 설정을 마친 후 web.xml의 spring context에 등록해줍니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
등록을 하는 이유는 DelegatingFilterProxty는 해당 이름의 빈을 Spring context에서 찾기 때문에 sercurity-context.xml이 context에 반드시 등록되어 있어야 합니다.
/* 경로로 들어오는 모든 HTTP요청을 springSecurityFilterChain 필터를 사용해 가로채고 Spring Security로 전달합니다.
web.xml에 추가
<!-- Spring Security 필터 등록 -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>