이것에 대한 정리 따로 필요
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
implementation 'org.springframework.boot:spring-boot-starter-security'
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.antMatchers("/", "/home").permitAll() // 홈 페이지는 모든 사용자가 접근 가능
.anyRequest().authenticated() // 그 외의 모든 요청은 인증 필요
)
.formLogin((form) -> form // 폼 로그인 사용
.loginPage("/login") // 커스텀 로그인 페이지 설정
.permitAll()
)
.logout((logout) -> logout.permitAll()); // 로그아웃은 누구나 가능
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build());
return manager;
}
}
user
,비밀번호:password
)/home
페이지는 인증없이 누구나 접근이 가능, 그 외의 페이지는 인증이 필요하다.@Bean
public UserDetailsService userDetailsService() { // Inmemory 설정
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER") // 'USER' 라는 권한 추가
.build());
manager.createUser(User.withDefaultPasswordEncoder()
.username("admin")
.password("adminpass")
.roles("ADMIN") // 'ADMIN' 이라는 권한 추가
.build());
return manager;
}
http
.authorizeHttpRequests((requests) -> requests
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN") // 관리자만 접근 가능한 페이지
.anyRequest().authenticated()
);
login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>로그인</title>
</head>
<body>
<h2>로그인 페이지</h2>
<form th:action="@{/login}" method="post">
<div>
<label>사용자 이름: </label>
<input type="text" name="username"/>
</div>
<div>
<label>비밀번호: </label>
<input type="password" name="password"/>
</div>
<div>
<button type="submit">로그인</button>
</div>
</form>
</body>
</html>
src/main/resources/templates/login.html
경로에 추가하면, /login
경로로 이동할 때 커스텀 로그인 페이지가 표시됩니다.http
.logout((logout) -> logout
.logoutUrl("/logout")
.logoutSuccessUrl("/home")
.permitAll()
);
<form th:action="@{/logout}" method="post">
<button type="submit">로그아웃</button>
</form>
스프링 시큐리티를 사용하여 간단한 로그인, 로그아웃 기능과 권한 설정을 구현하는 방법을 알아보았습니다. 여기서는 매우매우 기본적인 설정을 다루었지만, 스프링 시큐리티는 OAuth2, JWT, 세션 관리, CSRF 보호 등의 다양한 보안 기능을 제공합니다. 이를 확장하여 더 복잡한 애플리케이션에서도 강력한 보안을 설정할 수 있습니다.