웹/Spring

Spring 프로젝트에서 Spring Security 사용하기

Themion 2022. 4. 12. 09:45

웹 프로젝트를 개발하다 보면 민감한 데이터를 다루어야 할 일이 종종 생긴다. 예를 들어 회원 데이터를 다루는 경우, 비밀번호는 반드시 암호화하여 저장해야 하고 각 회원이 로그인했을 때 만들어지는 세션 역시 중복이나 위/변조가 발생하지 않도록 관리해야 한다. 이렇게 보안이 중요한 데이터를 다룰 때 Spring에서 사용하는 것이 바로 Spring Security이다.

Spring Security는 Filter Chain을 기반으로 한 프레임워크이다. 무슨 소리냐면, 어떠한 요청(예를 들어 로그인 등)을 처리할 때, 하나의 거대한 함수 안에서 모든 기능을 처리하는 것이 아니라 Spring Security에서 생성한 여러 개의 Filter를 차례로 거치면서 인증을 진행하게 된다는 것이다.

출처: Spring 공식 문서

따라서 Spring Security를 이용해 어떠한 기능을 구현하는 경우 해당 기능을 처음부터 끝까지 모두 구현하는 것이 아니라, 해당 기능의 특정 부분만을 따로 구현하여 Spring Security에서 제공하는 기능의 집합에 삽입해야 한다.

Spring Security를 Spring 프로젝트에 설치하는 것 자체는 간단하다. 다른 Spring의 프레임워크처럼 pom.xml(Maven을 사용하는 경우) 혹은 build.gradle(Gradle을 사용하는 경우)에 Spring Security의 dependency를 추가하면 Spring Security를 사용할 수 있다.

bulid.gradle에 Spring Security를 추가한 모습.

Spring Security는 자체적으로 세션 관리 기능을 가지고 있다. 따라서 Spring Security를 설치한 서버의 페이지에 접속하면 아래와 같이 자동으로 로그인 페이지로 리다이렉팅되는데, 이 로그인 페이지는 서버의 DB와 아무 연관 없는 페이지이므로 로그인하려면 Username 칸에 'user'를, Password 칸에는 Spring Security가 자동으로 생성한 Pasword를 입력해야 한다.

Spring Security를 추가한 뒤 서버를 실행하면 Spring Security에서 제공하는 로그인 페이지가 나온다.

 이 자동으로 생성한 Password는 Spring 서버를 실행한 터미널 창에서 확인할 수 있다. 만일 이러한 방식이 마음에 들지 않는다면, Spring 프로젝트의 application.yml을 수정해 따로 Username과 Password를 등록할 수도 있다.

Spring Security에서 자동으로 생성한 Password.
application.yml의 spring.security.user에서 Spring Security 로그인에 사용할 유저를 직접 등록할 수 있다.

 

Spring Security는 두 가지 방식으로 사용자를 구분하는데, 바로 인증(Authentication)과 인가(Authorization)이다. 인증은 로그인 등을 통해 사용자가 실제로 존재하는 사용자인지 구분하는 방식이고, 인가는 사용자의 권한을 확인해 사용자가 특정 행동을 해도 되는지 확인하는 방식이다. 다음 두 글에서 Spring Security에서의 인증과 인가가 각각 어떤 방법으로 이루어지는지 알아보도록 하자.