이랜서, AI '씨름' 동작 분석 알고리즘 과기정통부 NIA 우수과제 선정

Spring Security란? 사용하는 이유부터 설정 방법까지 알려드립니다!

IT 비즈니스의 모든 것

비즈니스 팁, 08 Feb 2024

spring-security


데이터의 중요성이 커지면서 고객 데이터의 효율적인 관리 능력 또한 중요해지고 있습니다. 쇼핑몰 또는 웹 페이지 같은 온라인 플랫폼을 운영하는 IT 기업이라면 사용자 권한 관리의 정교함이 특히나 중요해지고 있는데요.


홈페이지에 인증 및 권한 기능을 빠르게 부여해 인증 및 권한 보호 기능을 손쉽게 추가할 수 있는 Spring의 프레임워크 중 하나인 ‘Spring Security’의 필요성이 높아지고 있습니다.


필요한 데이터에 안전하고 빠르게 접근하도록 지원하며, 동시에 고객 정보 및 거래 데이터를 승인되지 않는 접근으로부터 보호하여, 고객 데이터를 효율적으로 관리하는 데 도움을 주는 Spring Security의 사용 이유부터 설정 방법까지 대한민국 No.1 IT 인재 매칭 플랫폼 이랜서에서 자세하게 알려드리겠습니다!




Spring Security란?


spring-security-jwt


Spring Security인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크입니다.


일반적으로 개발 시 가장 먼저 작업하는 부분이 사용자 관리 부분으로 가볍게는 회원가입부터 로그인, 로그아웃, 세션 관리, 권한 관리까지 온라인 플랫폼에 맞춰 다양하게 작업되는 인가 & 보안 기능은 개발자에게 많은 시간을 요구하는데요.


Spring 생태계 내에서 이러한 요구사항을 효과적으로 지원하기 위해 개발된 것이 Spring Security로 개발자들이 보안 관련 기능을 효율적이고 신속하게 구현할 수 있도록 도와줍니다.




Spring Security를 사용하는 이유


spring-boot-security


자바 개발자들이 보안 기능을 추가할 때 Spring Security 사용하는 이유는 Spring Security가 Spring의 생태계에서 보안에 필요한 기능들을 제공하기 때문입니다. Spring Security는 개발 구조가 Spring이라는 프레임워크 안에서 활용하기 적합한 구조로 설계되어 있어, 보안 기능을 추가할 때 활용하기 좋습니다. 


프레임워크를 사용하지 않고 코드를 직접 작성할 경우 Spring에서 추구하는 IoC/DI 패턴과 같은 확장 패턴을 염두 해서 인증/인가 부분을 직접 개발하기는 쉽지 않은데, Spring Security에서는 이와 같은 기능들을 제공해 주기 때문에 개발 작업 효율을 높일 수 있습니다.


때문에 많은 개발자들이 Spring을 사용할 경우에는 Spring Security를 활용하여 보안 기능을 추가하고 있으며, Spring Security에서 제공하는 기능 외에 추가적인 기능이 필요할 경우 Spring Security를 베이스로 기능을 추가하여 업무 효율을 높이고 있습니다.




Spring Security 아키텍처


Spring Security를 활용하기 위해 Spring Security가 어떤 아키텍처를 가지고 있는지 알아보도록 하겠습니다. 먼저 Spring의 요청 처리 과정과 관련하여 Spring Security의 아키텍처를 살펴보겠습니다.


spring-security-oauth2


위의 그림은 Spring에서 프레임워크나 라이브러리를 사용했을 때, 작동되는 구조를 표현한 그림입니다. 위의 그림을 보시면 붉은색 박스 부분이 Spring 프레임워크에서 Spring Security가 적용되는 부분입니다. 부담되지 않는 수준에서 심플하게 표현하였습니다.


Spring은 자바의 프레임워크답게 개발 구조가 잘 설계되어 있기  때문에 Spring 생태계에서 제공하는 라이브러리라면 기존의 코드를 변경하지 않고도 그림과 같이 중간에 삽입하여 사용할 수 있습니다. 


그림에 대한 이해를 돕기 위해 설명을 드리겠습니다. 그림을 순서대로 살펴보면 아래의 과정과 같습니다.


1. 사용자의 요청이 서버로 들어옵니다.


2. Authotication Filter가 요청을 가로채고 Authotication Manger로 요청을 위임합니다.


3. Authotication Manager는 등록된 Authotication Provider를 조회하며 인증을 요구합니다. 


4. Authotication Provider가 실제 데이터를 조회하여 UserDetails 결과를 돌려줍니다.


5. 결과는 SecurityContextHolder에 저장이 되어 저장된 유저정보를 Spring Controller에서 사용할 수 있게 됩니다.


대략적으로 이런 순서를 가지고 동작합니다. 어느 정도 이해가 되셨나요? 이제까지 Spring 과의 상호작용을 알아봤다면 다음으로는 Spring Security가 작동하는 내부 구조를 살펴보도록 하겠습니다



Spring Security가 작동하는 내부 구조


spring-security-로그인


1. 사용자가 자격 증명 정보를 제출하면, AbstractAuthenticationProcessingFilter가 Authentication 객체를 생성합니다.


2. Authentication 객체가 AuthenticationManager에게 전달됩니다.


3. 인증에 실패하면, 로그인 된 유저정보가 저장된 SecurityContextHolder의 값이 지워지고 RememberMeService.joinFail()이 실행됩니다. 그리고 AuthenticationFailureHandler가 실행됩니다.


4. 인증에 성공하면, SessionAuthenticationStrategy가 새로운 로그인이 되었음을 알리고, Authentication 이 SecurityContextHolder에 저장됩니다. 이후에 SecurityContextPersistenceFilter가 SecurityContext를 HttpSession에 저장하면서 로그인 세션 정보가 저장됩니다.


그 뒤로 RememberMeServices.loginSuccess()가 실행됩니다. ApplicationEventPublisher가 InteractiveAuthenticationSuccessEvent를 발생시키고 AuthenticationSuccessHandler 가 실행됩니다.



Spring Security을 적용하기 전에 이런 흐름을 가지고 작동한다는 것을 알아두면 도움이 됩니다. 사실 아키텍처나 처리 과정들은 구글링을 통하여 가볍게 구현 방법을 알 수 있기 때문에 이러한 과정들을 몰라도 실무에서 구현하는 데는 문제가 전혀 없습니다.


하지만 이러한 과정을 이해하고 있을 경우 Spring Security를 상황에 맞춰 적용하기 수월합니다. Spring Security의 작동 구조를 알고 있기 때문에, 작업을 빠르게 진행할 수 있고, 업무 효율도 더 올릴 수 있습니다.


때문에 Spring Security 아키텍처와 처리 과정을 이 글을 통해 꼭 한 번 상기해 보시는 것을 추천드리며, 부족한 부분은 실무에서 직접 경험하면서 채워나간다면, Spring Security를 다양한 환경에 적용할 수 있을 것입니다.




Spring Security를 사용하는 방법


Spring Security 설정하기


Spring Security를 간편하게 실습하기 위해 Spring Boot 3를 사용했습니다. 빌드 툴로는 gladle을 사용하여 Spring Spring, Spring 웹 정도의 라이브러리만 추가하여 프로젝트를 생성했습니다. 더불어 설정 편의를 위해 lombok 라이브러리도 추가했습니다. 아래 이미지는 해당 내용을 코딩으로 추가한 것이니, 따라 하실 분들은 참고하시면 좋을 것 같습니다.


spring-security-cors



그럼 바로 프로젝트를 실행해 보도록 하겠습니다. 먼저 Spring Boot 3를 실행하고 접속해 봅니다.



spring-security-login



설정을 하지 않았지만 로그인 페이지가 나타납니다.



spring-boot



로그인 페이지가 왜 나오는 것인지 확인하기 위해 로그를 한번 살펴보겠습니다. 로그를 확인해 보시면 이상한 패스워드가 등장한 것을 볼 수 있습니다. 


이 패스워드를 로그인 창에 기입해 보시면 됩니다. 아이디는 user입니다. Spring Spring 라이브러리를 프로젝트에 import 하면 Spring가 가지고 있던 화면이 보이고 인증을 요청하게 됩니다. 이런 부분들을 설정을 통해서 허용이 가능합니다.


Spring Security에서 웹사이트 보안에 가장 기본적인 기능인 아이디/패스워드 인증을 화면까지 지원합니다. 이것은 Spring Security 인증의 가장 기본적인 방법입니다. 사용자로부터 호출되는 URL의 인증, 인가는 아래와 같은 설정을 통하여 케이스별로 적용이 가능합니다.



spring-boot-initializr



Spring 설정을 위해 WebSecurityConfig 클래스를 추가하였습니다. 로그인 페이지가 나오지 않게 하기 위해 아래의 anyRequest().permitAll() 부분도 추가하였습니다. 이렇게 추가하면 요청되는 모든 URL을 허용하겠다는 의미입니다.


코드를 보시면 @EnableWebSecurity 어노테이션을 이용하여 상속 없이 간편하게 Spring의 기능을 사용하고 있습니다. Spring에서는 이렇게 라이브러리를 간편하게 사용할 수 있도록 지원하고 있습니다.


앞에 아키텍처에서 보았듯이 요청을 SecurityFilterChain이 가로채서 설정된 인증, 인가 부분을 체크하고 난 후 다음 흐름으로 이어지게 됩니다. 때문에 WebSecurityConfig라는 클래스에서 모든 관련 설정을 간단하게 할 수 있게 되어 내부의 비즈니스 로직에는 영향을 덜 미치게 됩니다. 


이것이 바로 Spring이 추구하는 약한 결함 방식입니다. Security를 포함하여 Spring 생태계에서 지원하는 모든 라이브러리들이 이런 흐름으로 동작한다고 볼 수 있습니다.



Spring Security 인증, 인가 처리하기


앞에서 가볍게 설정했던 방식을 넘어 조금 더 실무적으로 구현해 보겠습니다. Spring Security는 인증, 인가에 특화된 프레임워크(라이브러리)입니다. 이 부분을 좀 더 중점적으로 다루어 보도록 하겠습니다. 


인증이라고 하면 가볍게 로그인이라고 생각할 수 있습니다. 무수한 로그인 방법이 있지만 가장 기본적인 아이디 패스워드 방식을 Security를 이용해 처리해 보겠습니다.



spring-boot-3



인증 부분 처리를 위해 클래스에 내용을 좀 추가하였습니다. SpringSecurityFilterChain 부분에 formLogin 부분을 추가해 주시면 설정 클래스를 만들지 않았을 때처럼 Spring에서 제공하는 화면이 기본 화면이 됩니다.


그리고 아키텍처에서 살펴보신 것처럼 결국 로그인 처리가 되면 UserDetailsSerive 객체가 반환되게 되는데요. 이 부분의 아이디가 user1이고 패스워드가 1234인 유저정보를 픽스하기 위해 임의로 내용을 추가하였습니다. 


이 글에서는 Spring에 집중하기 위해 이렇게 샘플 케이스를 사용했습니다. 실제로 적용하실 때는 데이터베이스에 저장되어 있는 데이터를 기반으로 조회되도록 내용을 설정해야 합니다. 


마지막으로 PasswordEncoder 부분에는 Spring가 패스워드는 인코딩해야 한다는 보안 부분을 강제하기 때문에 이 부분도 추가하여야 합니다. 패스워드는 중요한 개인정보 중에 하나이기 때문에 암호화하여 저장해야 하는데 PasswordEncoder를 사용하시면 패스워드를 쉽게 암호화할 수 있습니다.

 

현재는 예시를 위해 NoOpPasswordEncoder 객체가 반환되도록 추가하였습니다. 

일반적으로 패스워드는 암호화되어 디비에 저장이 되고 디비에 저장된 문자로는 패스워드를 유추할 수 없게 하는 것이 현업에서 쓰이는 방법입니다. 이 부분을 Spring에서는 강제로 적용을 해 놓았습니다. 역시 보안 프로젝트답게 이런 부분도 들어가 있습니다. 


여기까지 인증 부분을 가볍게 살펴봤습니다. 다음으로는 인가 부분을 살펴보도록 하겠습니다.



spring-boot-devtools



인가는 간단하게 권한이라고 볼 수 있습니다. 호출되는 API나 URL 별로 권한을 체크하는 부분으로 로그인한 사용자의 권한 정보에 따라 API나 URL을 다르게 허용할 수 있습니다. 


쉽게 설명해서 사용자의 권한을 게임의 레벨이라고 생각하시면, 레벨 1의 사용자가 접근할 수 있는 페이지와 만렙의 사용자가 접근할 수 있는 페이지를 다르게 설정하고 싶을 때 해당 기능을 사용하시면 됩니다.  당연히 레벨 1의 사용자는 만렙 회원만 허용된 페이지에는 접근할 수 없도록 만들어야 합니다.


security config 클래스에 유저 정보를 리턴하는 부분에 해당 유저의 롤을 정의합니다. 이 코드의 의미는 인증된 사용자의 Role이 user라는 의미입니다. 이 부분은 프로젝트마다 네이밍 룰과 정의가 다를 수 있습니다.



spring-boot-jpa



다음 URL 호출에 대해 권한을 지정하기 위해 위와 해당 URL을 호출할 수 있는 권한을 지정합니다.



spring-boot-version



해당 API 또한 추가합니다. 그럼 로그인 후 API를 호출해 보도록 하겠습니다. /api1을 호출하면 정상적으로 호출되는 것을 볼 수 있습니다.



spring-boot-mybatis



다음으로 /api2 URL을 호출하면 에러가 발생하는 것을 볼 수 있습니다.



스프링


이렇게 인가 기능인 권한에 대한 체크를 할 수 있습니다. 인가 기능도 마찬가지로 기존의 코드 부분을 수정하지 않고도  Spring 설정 부분만 수정함으로써 적용이 가능합니다. 이 기능을 통해 권한이 부여된 사람들만 웹 페이지에 들어가도록 설정할 수 있습니다. 이런 부분을 Spring Security를 배제하고 직접 작업하신다면 기존 코드도 상당히 수정해야 할 것입니다.



로그인한 사용자 정보 조회하기


이번에는 로그인한 사용자의 정보를 출력하는 API를 만들어 보도록 하겠습니다.



스프링-부트



위와 같이 기존 컨트롤러에 /user API를 추가합니다. 또한 메서드 인자로 @AuthenticationPrincipal 부분이 추가됩니다. Spring의 설정 빈 중에 UserDetailSerivce가 반환한 UserDetails 객체가 SecurityContext에 저장되어 Spring에서 제공하는 어노테이션을 이용하면 저장된 객체를 조회할 수 있습니다. 이렇게 하면 유저명을 볼 수 있습니다.



스프링-시큐리티



위에 예제와 마찬가지로 로그인을 하고 해당 API를 호출해 보면  로그인한 유저의 정보를 그대로 가져올 수 있게 됩니다.  해당 기능을 적용하게 되면 일반적인 사이트의 나의 정보 페이지에 들어가서 현재 내 정보를 확인할 수 있는 기능에 사용할 수 있습니다.


지금까지 몇 가지 예제와 함께 Spring Security의 기본적인 기능들을 살펴보았습니다.

사실 예제는 지극히 기본적인 기능이며, Spring Security의 기능은 책 한 권이 나올 정도로 무궁무진합니다. 그렇기에 기본적인 사용법에 익숙해졌다면 프로젝트에 적용해 보면서 좀 더 많은 기능들을 활용해 보는 것을 추천드립니다.




Spring Security를 활용하면


스프링-프레임-워크


Spring Security를 활용하면 Spring 프레임워크에서 인증, 인가와 관련된 부분을 시간을 

많이 들이지 않고 깔끔하게 작업할 수 있습니다. 또한 인증, 인가 기능이 적용되지 않은 프로젝트에 인증, 인가 기능을 추가할 때에도 아주 유용하게 활용할 수 있습니다.


위에서 보여드린 예제처럼 기존의 코드를 많이 변경하지 않고 Spring에 최적화된 방법을 통하여 인증, 인가 기능을 삽입하는 것이 가능하기 때문에 보안 관련 기능 추가시 유용하게 활용할 수 있습니다.


보안을 위한 인증, 인가 기능을 추가해야 하나요? 로그인, 로그아웃, 회원정보 조회 기능들을 기존의 API와 연동해야 하나요? Spring Security를 활용해 보세요. Spring 프레임워크 구조에 맞고 빠르게 작업하실 수 있게 해드립니다.




Spring Security를 활용해 보안 기능을 적용할 

자바(Java) 개발자를 찾으시나요? 



대한민국 No.1 IT 인재 매칭 플랫폼 이랜서



워드-스프링


이랜서는 현장에 바로 투입할 수 있는 IT 프리랜서를 매칭하는 IT 인재 매칭 플랫폼입니다. Spring 프레임워크를 적용해 개발을 효율적으로 진행하는 자바(Java) 개발자부터 Kotlin, React, Vue, Angular, PHP 전문가부터 Node jsNestjs, JavaScirpt, TypeScript, MS SQL, My SQL 등을 활용할 백엔드 개발자, 모바일 앱 개발을 위한 React Native, Flutter 등등 실력 있는 IT 프리랜서 약 40만 명의 IT 인재 군을 보유하고 있습니다.



자바-스프링



24년의 데이터로 전문성부터 인성까지

객관적인 데이터로 검증하여 프로젝트에 딱 맞는 프리랜서를 매칭하는 프리미엄 매칭 서비스.



성공적인 프로젝트 개발을 위해서는 개발자의 전문성과 인성(협업 능력)까지 확인해야 합니다. IT 프로젝트는 다양한 직군의 전문가들이 협업하여 프로젝트를 진행합니다. 하지만 대부분의 채용 플랫폼들은 IT 전문가의 이력서경력 기술서만 보고 IT 전문가를 추천하는데요.


이랜서에서 매칭하는 IT 프리랜서는 다릅니다. 약 1.5억 개의 사용자 데이터와 350만 개의 프리랜서 평가 데이터를 활용하여 IT 프리랜서의 전문성부터 인성(협업 능력)까지 프로젝트의 적합한지 철저하게 검증하여 매칭합니다. 그 결과 이랜서를 사용하는 기업들의 프로젝트 재의뢰율은 98%에 이르고 있습니다.



스프링-시큐리티-로그인



기업과 프로젝트 맞춤형 매칭을 위한  프리미엄 매칭 서비스

1:1 매니저 매칭 시스템을 통해 요구사항에 가장 적합한 IT 프리랜서를 매칭합니다.



이랜서는 프로젝트에 가장 적합한 IT 프리랜서를 매칭합니다. 이랜서를 사용하는 기업의 요구사항을 최대한 반영하기 위해 프로젝트 등록 시 1:1로 매니저를 배정합니다. 그리고 24시간 이내 최적합 IT 프리랜서를 매칭합니다. 덕분에 이랜서를 사용하는 기업은 IT 전문가 채용에 드는 시간을 아끼고 온전히 프로젝트에 집중하고 있습니다.





Spring Security를 활용해 보안 기능을 추가할

실력있는 자바(Java) 개발자를 찾으시나요?



대한민국 No.1 IT 인재 매칭 플랫폼 이랜서

-> 회원 가입만 하세요.

-> 24시간 안에 전담 매니저가 연락을 드립니다.

-> 끝입니다. 이게 다냐구요? 네, 이게 다입니다.

-> 급하시다고요? 전화 주세요. 02-545-0042


24년의 노하우 데이터를 바탕으로 검증된 IT 프리랜서를 매칭해 드립니다.





최신 블로그