개발자
[SpringSecurity]스프링 시큐리티란?/ PasswordEncoder 스프링 시큐리티를 사용해서 패스워드 암호화 하기 본문
[SpringSecurity]스프링 시큐리티란?/ PasswordEncoder 스프링 시큐리티를 사용해서 패스워드 암호화 하기
GoGo개발 2023. 6. 13. 15:01로그인을 구현하기 앞서 패스워드를 먼저 암호화해줄 필요가 있어졌다. 이번 로그인은 spring secutiry를 이용해 구현해줄 것이기 때문에 패스워드도 spring security를 이용해서 해보겠다
Spring Security가 뭐지?
Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다. Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다. Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.
스프링 시큐리티는 인증(Authentication)과 인가(Authorization)라는 말을 알고가야 이해가 쉽다.
Authentication(인증)은 말 그대로 사용자가 인증하는 과정을 뜻하며(해당 사용자가 본인이 맞는지를 확인하는 절차)
Authorization은 서버가 사용자에 대한 권한을 부여하는 것을 말한다.(인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차 )
시큐리티를 구현하기 앞서 스프링에서 request가 들어왔을때의 처리단계와 Spring Security의 동작원리가 궁금하다면 아래 포스팅을 링크해놨으니 참고하시면 좋겠다
request요청이 들어왔을때 스프링부트 처리단계
https://gogowlgml.tistory.com/98
[Spring boot] Spring 처리단계(Filter,DispatcherServlet,InterCepter,controller)
Spring Security를 구현하면서 그 동작원리를 이해하기 위해서는 Spring boot에서 request요청이 들어왔을때 어떤 단계로 처리되는지를 알아야 할 필요가 있다. 구현하는데 급급해서 구현했지만 이론을
gogowlgml.tistory.com
Spring seucrity 동작원리
추가로 스프링 시큐리티에 대한 설명과 자세한 내용은 내포스팅으로 부족한 부분이 있을 수 있어 아래블로그가 너무 잘정리되어있어서 들어가서 보는걸 추천한다
https://mangkyu.tistory.com/76
[SpringBoot] Spring Security란?
대부분의 시스템에서는 회원의 관리를 하고 있고, 그에 따른 인증(Authentication)과 인가(Authorization)에 대한 처리를 해주어야 한다. Spring에서는 Spring Security라는 별도의 프레임워크에서 관련된 기능
mangkyu.tistory.com
구조에 대한 설명
https://velog.io/@seongwon97/security
[Spring Security] 기본 동작 구조 이해하기
인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.
velog.io
설명은 블로그들로 갈음하고 나는 바로 적용을 해보기로 한다
우선 spring security를 사용하기위해 dependency를 추가해준다(나는 멀티모듈 환경이라 공통모듈 build.gradle에서 서브프로젝트에 모두 적용되는 위치에 추가해줬다)
스프링 시큐리티 의존성 추가시 시큐리티의 초기화 작업 및 보안 설정이 이뤄져서 기존의 추가설정을 해주지 않으면 기존 api를 사용할 수 없게 된다. 보안인증 절차가 필요없는 페이지들은 인증 절차를 거치지 않도록 허가해주는 설정이 필요하다
의존성 추가시 추가로 어떤일이 일어는지 궁금하다면 아래 블로그를 참고하도록 하자.
https://catsbi.oopy.io/c0a4f395-24b2-44e5-8eeb-275d19e2a536
스프링 시큐리티 기본 API및 Filter 이해
목차
catsbi.oopy.io
그다음 security 설정 클래스를 작성해주어야 한다
나는 common 모듈에 config 패키지를 만들어서 WebSecurityConfig 클래스를 추가해주었다.
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public PasswordEncoder getPasswordEncoder(){
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
위의 클래스 처럼 작성해야하는데 하나씩 뜯어보도록 하자
우선, Spring Security에서 제공하는 PasswordEncoder는 인터페이스이기 때문에 위와 같이 구현체를 빈으로 등록해야 사용할 수 있다.
@Configuration
해당 클래스가 1개 이상의 Bean을 제공한다면 @Configuration을 사용해야 한다
@Bean
@Bean을 사용하는 클래스에는 반드시 @Configuration 어노테이션을 활용하여 해당 클래스에서 Bean을 등록하고자 함을 명시해주어야 한다. 여기서는 PasswordEncoder를 Bean으로 등록해주기 위해 쓰였다
@EnableWebSecurity
@EnableWebSecurity는 모든 요청 URL이 스프링 시큐리티의 제어를 받도록 만드는 어노테이션이다.
회원가입을 위한 인증절차가 필요없는 페이지 만들기
스프링 시큐리티의 세부 설정은 SecurityFilterChain 빈을 생성하여 설정할 수 있습니다. Spring Security 이전 버젼에서는 아래와 같이 WebSecurityConfigurerAdapter을 상속 받은 WebSecurityConfig 클래스를 만들었어야 했습니다.
@Configuration
@EnableWebSecurity // Spring Security 설정을 시작
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
하지만 WebSecurityConfigurerAdapter는 Deprecated 되었으므로 사용하지 않고 아래와 같이 SecurityFilterChain을 Bean으로 등록하여 사용합니다. Bean으로 사용하기 위해 Class에 @Configuration 어노테이션을 추가해주어야 하는데 우리는 이미 해주었으니 넘어갑니다.
@Bean
public SecurityFilterChain filterChian(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.POST,"/employees").permitAll()
.anyRequest().authenticated();
http.csrf().disable();
return http.build();
}
WebSecurityConfigurerAdapter 을 상속받는 것과 차이점은 return 타입을 통해 끝에 build()를 해서 반환해줘야 한다는 점입니다. 이제 한줄씩 차례대로 살펴 봅시다
.authorizeRequests()
URI에 따른 페이지에 대한 권한을 부여하기 위해 시작하는 메소드 입니다. 아래의 antMatchers 기능을 이용하기 위한 메소드라고 보면 됩니다.
.antMatchers(HttpMethod.POST,"/employees")
.antMatchers("/login**", "/web-resources/**", "/actuator/**")
특정 URL 접근 시 인가가 필요한 URI를 설정할 수 있습니다(특정 리소스에 대해서 권한을 설정합니다)
.authenticated()를 사용하면 해당 URI는 인증이 필요한 URI라고 명시할 수 있습니다.
.antMatchers(HttpMethod.POST,"/employees").permitAll()
antMatchers("/login**", "/web-resources/**", "/actuator/**").permitAll()
.permitAll() : antMatchers 설정한 리소스의 접근을 인증절차 없이 허용한다는 의미 입니다.
.anyRequest().authenticated()
모든 리소스를 의미하며 접근허용 리소스 및 인증후 특정 레벨의 권한을 가진 사용자만 접근가능한 리소스를 설정하고 그외 나머지 리소스들은 무조건 인증을 완료해야 접근이 가능하다는 의미입니다.
.anyRequest().permitAll()
특정 URI을 제외한 나머지 URI은 전부 인가해줍니다.
http.csrf().disable()
CSRF 공격에 대한 방어를 해제 합니다.
Spring Security는 CSRF 공격에 대한 방어를 기본으로 탑재하고 있습니다.
CSRF에 대한건 다른 포스팅에서 다루겠습니다. 이걸 추가해주지 않으면 톰캣에서는 Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [974] millisecon오류가 포스트맨에서는 401Unauthorized 오류가 떴습니다. 왜그런지는 CSRF의 개념에 대해 알아야겠죠? 포스팅 올리는대로 링크 걸어놓겠습니다
이렇게 하고나서 결과를 확인해 보면
포스트맨에서는 api테스트할때 보안상 암호화된 비밀번호가 클라이언트에게 노출되지 않게하기 위해 reponse에 pw는 내려주지 않았습니다
DB를 확인하면 정상적으로 암호화가 된 것을 볼 수 있습니다
참고 블로그
https://youngjinmo.github.io/2021/05/passwordencoder/
스프링 시큐리티 이용하여 패스워드 암호화 적용하기
이 포스팅은 2년전 처음에 작성했던 글을 수정하는 글이다. 스프링 시큐리티를 공부하고 적용한게 아니라 프로젝트중에 빠르게 개발에 적용해본 경험을 기반으로 간단한 튜토리얼을 위한 글임
youngjinmo.github.io
https://jaehoney.tistory.com/249
Spring Security - SecurityFilterChain 사용하기! (+ WebSecurityConfigurerAdapter is Deprecated)
WebSecurityConfigurerAdapter 프로젝트 개발을 진행중에 WebSecurityConfigurerAdapter가 Deprecated된 것을 확인했다. Spring Security 5.7.0-M2 부터 해당 클래스는 컴포넌트 기반의 보안 설정을 권장한다는 이유로 Deprec
jaehoney.tistory.com
[Spring] 빈 등록을 위한 어노테이션 @Bean, @Configuration, @Component 차이 및 비교 - (1/2)
기존의 Spring MVC에서는 xml을 활용하여 Bean을 등록하고 있었다. 하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들을 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션(Annotation, @)를 활
mangkyu.tistory.com
https://velog.io/@sunnamgung8/Spring-Security-PasswordEncoder
[Spring Security] PasswordEncoder
PasswordEncoder Spring Security에서는 비밀번호를 안전하게 저장할 수 있도록 비밀번호의 단방향 암호화를 지원하는 PasswordEncoder 인터페이스와 구현체들을 제공합니다. PasswordEncoder의 제공된 구현 클래
velog.io
https://thenicesj.tistory.com/329
Spring Boot로 만드는 Spring Security 로그인 구현 - Session(1)
코드는 Github을 통해 확인할 수 있습니다. 과거에 사용했었지만 현재 Deprecate된 것은 다시 새롭게 구현했습니다. 일부 코드에 대해 좀 더 효율적인 방법으로 구현해놨습니다. 목차 페이지 별로 권
stir.tistory.com
https://kimchanjung.github.io/programming/2020/07/02/spring-security-02/
[Spring Security] 스프링시큐리티 설정값들의 역할과 설정방법(2)
스프링시큐리티의 여러가지 설정값들의 역할과 설정방법을 상세히 알아봅니다. Spring Security 커스텀 필터를 이용한 인증 구현 - 스프링시큐리티 설정(2) 본 포스팅은 스프링시큐리티의 전반적인
kimchanjung.github.io
CORS 란?
한가지 극단적인 예를 들어본다면, 만약 어떤 악성 프로그램이 당신의 컴퓨터에 설치가 되고 해당 프로그램을 통해서 브라우저에서 특정 명령을 수행한다면 어떻게 될까? 로그인이 세션으로 잡
thenicesj.tistory.com
https://jaehoney.tistory.com/249
Spring Security - SecurityFilterChain 사용하기! (+ WebSecurityConfigurerAdapter is Deprecated)
WebSecurityConfigurerAdapter 프로젝트 개발을 진행중에 WebSecurityConfigurerAdapter가 Deprecated된 것을 확인했다. Spring Security 5.7.0-M2 부터 해당 클래스는 컴포넌트 기반의 보안 설정을 권장한다는 이유로 Deprec
jaehoney.tistory.com
'개발자 > workflow 리팩토링 프로젝트(SpringBoot,JPA,MySQL)' 카테고리의 다른 글
[Spring Security] 스프링 시큐리티 동작 원리 - 1 (0) | 2023.07.01 |
---|---|
[Spring boot] Spring 처리단계(Filter,DispatcherServlet,InterCepter,controller) (0) | 2023.06.27 |
[멀티모듈 지옥 탈출기] 멀티 모듈 파헤쳐보기-2(JPA,Gradel,SpringBoot) (0) | 2023.05.22 |
[멀티모듈 지옥 탈출기] 멀티 모듈 파헤쳐보기-1(JPA,Gradel,SpringBoot) (1) | 2023.05.19 |
[JPA] Lombok 어노테이션(@Data,) (0) | 2023.05.02 |