상세 컨텐츠

본문 제목

[2월] :: 백엔드 탐구생활 :: 뭐 하고 계세요? Spring Security요

[8기 SSAFYcial] 싸피의 모든 것

by 감싹이 2023. 2. 27. 09:04

본문

많은 사람들이 사용하는 서비스를 출시하기 위해 가장 중요하게 생각해야 하는 게 무엇일까요? 사용자 친화적 UI? 눈길을 끄는 마케팅 기획? 획기적인 서비스 아이디어? 모두 중요한 것들입니다. 하지만 빌게이츠가 남긴 유명한 명언이 있죠.

Security is, I would say, our top priority because for all the exciting things you will be able to do with computers – organizing your lives, staying in touch with people, being creative – if we don’t solve these security problems, then people will hold back.

우리에게 보안은 최우선 사항이라고 할 수 있다. 왜냐하면 생활을 관리하고, 사람들과 연락을 계속하고, 창의적으로 지내는 등, 컴퓨터로 당신이 할 수 있는 모든 일들을 하기 위해서 우리가 보안 문제들을 해결하지 않으면 사람들은 컴퓨터 사용을 자제할 것이기 때문이다.

우리에게 보안은 최우선 사항이라고 할 수 있다.

우리가 보안 문제들을 해결하지 않으면 사람들은 컴퓨터 사용을 자제할 것이기 때문이다.

 

개발자라면 서비스 출시 시 가장 신경써야 할 부분은 바로!

 

'보안'입니다.

 

오늘은 이 보안과 관련된 프레임워크인 Spring Security에 대해 알아보고자 합니다.

 


0. 스프링 시큐리티 공식문서

스프링 시큐리티 공식문서는 다음과 같습니다.

https://docs.spring.io/spring-security/reference/index.html

 

Spring Security :: Spring Security

If you are ready to start securing an application see the Getting Started sections for servlet and reactive. These sections will walk you through creating your first Spring Security applications. If you want to understand how Spring Security works, you can

docs.spring.io

 


1. Spring Security 란?

스프링 시큐리티는 스프링 기반 스프링 하위 프레임워크입니다. 공식 문서를 보면, 스프링 시큐리티가 Authentication(인증)과 Authorization(권한)을 자바 어플리케이션에 제공하는 데 초점을 맞춘 프레임워크라고 설명되어 있습니다. 이처럼 스프링 시큐리티는 애플리케이션의 보안(인증, 권한, 인가 등)을 담당하고 있는데요, 스프링 시큐리티는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리합니다.

 

 

1-1 Authentication

스프링 시큐리티의 Authentication(이하 인증)은 API에 접근하는 사용 주체가 누구인지 입증하는 과정을 의미합니다. 어떤 서비스가 있을 때 로그인 등의 과정을 통하여 개인을 인증해야 서버, 혹은 데이터 베이스의 정보를 안전하게 개인에게 넘겨줄 수 있기 때문에 Authentication이 필요합니다. 즉, 스프링 시큐리티가 추구하는 Authentication의 목적은 서버가 리소스 혹은 데이터의 개인화된 사용성을 보장하는 데 있다고 볼 수 있습니다.

 

 

1-2 Authorization

스프링 시큐리티의 Authorization은 권한을 부여하는 것입니다. 위의 '인증'을 통해서 특정 API에 접근하려는 사람이 누구인지 입증하는 게 끝났다면, 그 다음에 해야 하는 행위는 과연 이 사람이 이 API를 사용할 자격이 있는가?에 대한 문제를 해결하는 것입니다.

서비스에는 특정 상황에서, 특정 유저, 혹은 관리자만 사용할 수 있어야 하는 기능이 존재합니다. 이런 기능을 모든 유저가 사용할 수 있게 된다면, 이를 악용하는 일부 사용자에 의해 서비스는 마비되고 더 이상 운영을 할 수 없는 지경에 이르게 될 것입니다. 따라서 스프링 시큐리티에서는 이러한 문제를 해결하고자 인증된 사용자가 어디까지의 웹 리소스와 기능, 그 외의 것들을 사용할 수 있도록 설정해줄 것인가?라고 정의하고 있습니다.

 

 


2. Spring Security 동작 원리

 

스프링 시큐리티의 아키텍쳐를 살펴보며 동작과정을 설명하겠습니다. 현재 사용자가 로그인 중인 상황이라고 가정합니다. 스프링 시큐리티는 다음과 같이 동작합니다.

 

1. 사용자는 로그인 정보가 담긴 Request를 보낸다.

2. AuthenticationFilter는 사용자가 보낸 아이디와 패스워드를 인터셉트하여 해당 정보에 대한 유효성 검사를 진행한다.

3. 진짜 인증을 담당할 AuthenticationManager 인터페이스(구현체 : ProviderManager)에게 인증용 객체(UsernamePasswordAuthenticationToken)을 만들어주어서 위임한다.

4. 실제 인증은 AuthenticationProvider에서 진행된다. 따라서 AuthenticationProvider에게 Authentication객체(UsernamePasswordAuthenticationTocken)을 전달한다.

5. 인증절차가 시작되면 AuthenticationProvider 인터페이스가 실행된다. 

 

6. DB에 있는 이용자의 정보와 화면에서 입력한 로그인 정보를 비교한다.

6-1. AuthenticationProvider 인터페이스에서 DB에 있는 이용자 정보를 가져오기 위해 UserDetails Service 인터페이스를 사용한다.

6-2. UserDetailService 인터페이스는 화면에서 이용한 이용자의 이름(UserName)을 가지고 loadUserByUsername() 메서드를 호출하여 DB에 있는 이용자의 정보를 UserDetails 형으로 가져온다.

6-3. 이용자가 존재하지 않으면 예외를 호출한다.

 

7. DB에서 가져온 이용자의 정보와 화면에서 입력한 로그인 정보를 비교하게 되고, 일치하면 Authentication 참조를 리턴하고, 일치하지 않으면 예외를 던진다.

8. 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담은 후 AuthenticationSuccessHandle을 실행한다.

8-1. 실패 시 AuthenticationFailureHandler를 실행한다.

 

 


2학기 프로젝트 진행 시 빠질 수 없는 부분이자 가장 중요한 부분인 스프링 시큐리티에 대해 간단하게 알아보았습니다. 다음달에도 도움이 되는 기사로 찾아올 테니 기대해주시길 바라며 이상으로 이번 달 기사를 마치도록 하겠습니다.

 

읽어주셔서 감사합니다!

참고

Spring Security란?

Spring Security의 기본에 대해서 알아보자

Spring Security 동작 원리

 

 

 

관련글 더보기