최근 Spring boot + Mybatis 프로젝트를 새롭게 진행하고 있는데,
진행 중 Spring Security를 적용한 로그인 기능이 필요하여 알아보게 되었다.
Spring Security를 제대로 알고 프로젝트에 적용하기 위해선 공부해야 하는 양이 많아 시간도 많이 필요하다.
그래서 이번엔 얄팍하게나마 Spring Security에 대해 실습을 위주로 감을 잡아보도록 하자
Spring Security는 원래 별도의 프레임워크로 시작되었지만, 스프링으로 프로젝트가 통합되면서 함꼐 사용되게 되었다.
개발자는 Spring Security를 이용하여 약간의 코드와 설정만으로도 로그인 및 자동 로그인, 페이지 이동 처리 등의 기능을 구현할 수 있어 개발 생산성을 높일 수 있고, 세션과 쿠키에 대한 핸들링이 대부분 자동으로 이뤄진다는 장점이 있다.
간단한 로그인 예제를 통해 Spring Security를 경험해보자
이번 실습에서는 Spring Boot 프로젝트를 사용해서 구현해볼 예정이라 프로젝트 생성이 필요하다.
Spring Initializer를 사용하면 간단하게 프로젝트 구조를 생성할 수 있으니 참고하자
아래는 실습에 사용할 Stack이다.
기본적인 Spring Boot 웹 프로젝트 구성 방법은 생략하고 진행한다.
프로젝트를 실행하면, 기본적으로 user 라는 Username과 Auto generated된 Password가 자동으로 만들어진다.
오로지 개발을 위해 무작위로 생성된 Password임을 알려준다.
그런 다음 http://localhost:8080/ 경로로 접근하면, Spring Security에서 기본적으로 제공하는 로그인 페이지로 이동된다. (http://localhost:8080/login)
여기서 user, 자동으로 생성된 password를 입력하면 로그인 처리가 완료된다.
로그인 처리가 완료되면 Whitelabel Error Page가 표시된다.
로그아웃은 아직 구현해두지 않았기 때문에 브라우저에서 가지고 있는 세션을 초기화 시켜줘야 한다.
아래와 같이 F12를 눌러 개발자 도구 > 애플리케이션 > 쿠키에 들어가보면 JSESSIONID라는 쿠키가 있는데, 이것을 삭제해준 뒤 페이지를 새로고침(F5)하면 다시 로그인 창으로 이동된다.
여기까지가 Spring security의 기본 동작 흐름이다.
실제로 Spring Security를 프로젝트에 적용하기 위해서는 로그 설정, 프로젝트의 기본 properties 파일인 application.properties(혹은 application.yml) 외에 별도의 Security properties 파일 설정, 커스텀 로그인 페이지,
정적 파일 경로들에 대한 허용과 비허용 처리, 권한 처리, DB와 사용자 정보를 연동한 로그인 처리 등 더 많은 설정들을 요구한다.
이번에는 MySQL DB에 회원 정보를 넣고, 커스텀 로그인 페이지를 만든 뒤, 정적 파일 경로들에 대한 허용 처리를 하여 메인 인덱스 페이지까지 이동해보도록 한다.
먼저 security의 자세한 로그 확인을 위해 application.properties 파일에 Spring Security 로그를 Trace하는 부분을 추가해준다.
logging.level.org.springframework.security=TRACE
다시 프로젝트를 Restart하고 나서 화면을 이동해보면 굉장히 많은 Security 관련 로그가 표시되는 것을 볼 수 있다.
Spring Security는 보안 기능대략 10개 정도의 Filter를 사용한다.
static 폴더 하위에 index.html을 생성해주면, Spring 프로젝트는 localhost:8080으로만 접속해도 알아서 index.html로 이동시켜 준다.
만약 로그인을 하지 않아도 index.html 화면은 볼 수 있도록 설정해주고 싶다면, 별도의 파일을 만들어 필터링되지 않도록 해줘야 한다.
프로젝트 경로 내에 Config directory를 생성하고 JAVA Config 파일을 생성해준다.
package com.example.demo.config;
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.web.SecurityFilterChain;
@Configuration
public class CustomSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
return httpSecurity.build();
}
}
이후에 프로젝트를 다시 Restart하고 인덱스 페이지로 이동하면 로그인 과정 없이 로그인 되는 것을 확인할 수 있다.
지금이야 로그인 후에 index.html로 이동하면 정적 파일인 css, js 파일 등을 잘 불러와서 문제없이 잘 돌아가지만,
실제 프로젝트에서는 모든 페이지가 전부 로그인 없이 들어가지도록 구현해서는 안되고, 적절한 권한을 쥐어줘야 한다.
아래와 같이 Config 파일에 Bean을 추가해주면 된다.
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations());
}
예를 들어 만약 특정 페이지로 이동하는 경우 로그인한 회원만 볼 수 있도록 하려면 별도의 설정을 해줘야 한다.
커스텀 로그인 페이지를 만들어서 로그인을 구현하는 방법은 다음 편에서 계속 작성하겠다.
WebStrom에서 사용하는 다양한 단축키 모음 (1) | 2023.03.17 |
---|---|
웹 표준과 크로스 브라우징 (0) | 2023.02.24 |
[Javascript] 반복문 정리(for, for in, for of, forEach) (0) | 2023.02.11 |
개발자 도구 사용법 (2) | 2023.02.01 |
[xampp] php+apache+mysql 한번에 끝내는 로컬 개발환경 설정 (0) | 2023.01.14 |