[Spring Security] Hello Spring Security -1

·2022년 11월 22일
0

SpringSecurity

목록 보기
6/13
post-thumbnail

Hello Spring Security👋

로그인 기능에 Security 적용 하기!

의존 라이브러리 적용

의존 라이브러리를 적용하면 Spring Security가 제공하는 디폴트 로그인 페이지를 만나볼 수 있다.


왼쪽은 Spring Security가 적용된 화면이고 오른쪽은 적용 전 화면이다. URI를 보면 알 수 있듯이 Spring Security를 적용하면 자동으로 login 화면으로 이동된다.

☝️ 우리는 아직 사용자의 정보를 저장하는 회원 가입 처리를 진행하지 않았다. 그럼 어떻게 로그인을 하란말이야....

디폴트 로그인 정보

애플리케이션을 실행한 후 출력된 로그를 살펴보면 Spring이 자체적으로 생성한 Password를 제공해주는 것을 알 수 있다.

  • Username : user로 공통화 되어 있다.
  • Password : 애플리케이션이 실행될 때마다 생성 -> 매번 바뀐다는 말!

잘못된 password를 입력하면 Spring Security가 인증 실패 메세지를 보낸다.

☝️ 한가지 문제점!
애플리케이션이 실행될 때마다 재생성되는 password 괜찮을까?
이거만으로 우리는 사용자 인증을 할 수 있을까?

🌿Spring Security Configuration 적용

Spring Security Configuration을 적용해 우리가 원하는 인증 방식과 웹 페이지에 대한 접근 권한을 설정할 수 있다.

@Configuration : 해당 클래스가 Configuration임을 알려준다.

1. InMemory User 등록

사용자 인증을 위한 계정 정보를 Bean으로 등록해 고정된 값으로 사용할 수 있도록 했다.

UserDetail

  • 인터페이스
  • 인증된 사용자의 핵심 정보를 포함하고 있다.
  • 구현체로는 User 클래스를 사용한다.

UserDetailManager

  • 인터페이스
  • UserDetail를 관리하는 역할을 한다.
  • 현재는 InMemory상의 데이터를 관리하고 있으므로 구현체인 InMemoryUserDetailsManager를 사용한다.

withDefaultPasswordEncoder()

  • 암호화 메서드

  • Deprecated 상태
    Using this method is not considered safe for production, but is acceptable for demos and getting started. For production purposes, ensure the password is encoded externally. See the method Javadoc for additional details. There are no plans to remove this support. It is deprecated to indicate that this is considered insecure for production purposes.😱

  • 간단하게 요약하자면 실 개발 목적으로 사용하기엔 부적합하며, 데모 및 초안에만 사용하는 것을 권장한다는 뜻! 없어질 가능성은 없다!

2. HTTP 보안 구성

HttpSecurity를 파라미터로 가지고, SecurityFilterChain을 리턴하는 형태의 메서드를 정의하면 HTTP 보안 설정을 구성할 수 있다.

💡HttpSecurity : HTTP 요청에 대한 보안 설정을 구성하기 위한 핵심 클래스

2-1. 커스텀 로그인 페이지 지정하기

HTTP 보안 구성하다 갑자기 커스텀 로그인 페이지? 갑자기? 당연..그게 HTTP니까 끄덕.

csrf().disable()

CSRF 공격에 대한 보안 설정을 의미한다. disable()를 통해 공격을 무력화한다.

formLogin()

폼 로그인 방식(기본적인 인증 방법)을 지정한다.

loginPage("/auths/login-form")

로그인 페이지를 지정한다. 미리 정해둔 템플릿의 이름과 동일한 URL을 작성해 loginForm() 핸들러 메서드에 요청을 해당 URL에 전송할 수 있도록 한다.

loginProcessingUrl("/process_login")

해당 메서드 파라미터로 메서드 실행 시, 로그인 인증 요청을 수행할 URL을 지정

💡 인증 요청을 수행할 URL을 지정한다 하더라고 결국엔 Spring Security 내부에서 인증 프로세스를 진행!!
현재는 커스텀 로그인 페이지를 통해 Spring Security가 로그인 인증 처리를 하는 것이라고 기억하기

failureUrl("/auths/login-form?error")

로그인 인증에 실패할 경우, 리다이렉트할 페이지를 지정

☝️ and()
체인은 서로 연결되어 있다. 🔗⛓️
서로 다른 인증 필터를 연결해주는 메서드

2-2. request URI에 접근 권한 부여

사용자에게 부여된 Role 이용해 애플리케이션의 request URI에 접근 권한을 부여할 수 있다.

권한이 없는 사용자가 특정 request URI에 접근할 경우 403(Forbidden) 에러가 발생한다.
그러나 사용자에게 에러 페이지만 보여주면 왜 이런 상황이 벌어졌는지 알 방법이 없기 때문에 해당 상황에서 특정 페이지를 설정해 사용자의 편의를 생각해야 한다.

exceptionHandling().accessDeniedPage("/auths/access-denied")

  • exceptionHandling() : Exception을 처리하는 기능을 하는 메서드
  • accessDeniedPage() : 403에러 발생시, 파라미터로 지정한 URL로 리다이렉트 된다.

authorizeHttpRequests()

람다식을 통해 request URI에 대한 접근 권한을 부여할 수 있다.

  • antMatchers() : ant 빌드 툴에서 사용되는 Path Pattern을 이용해서 매치되는 URL을 표현한다.

  • antMatchers("/orders/**").hasRole("ADMIN") 의 의미
    antMatchers() 의 파라미터 URL의 접근 권한은 ADMIN Role을 부여받은 사용자만 접근할 수 있다.

  • antMatchers("/**").permitAll() : 나머지 URL은 Role에 상관없이 접근 가능

☝️ 주의할 점
antMatchers()을 적용할 때에는 순서를 잘 생각해서 해야 한다.
만약 antMatchers("/**").permitAll()이 가장 먼저 온다면 그 후에 접근 제한을 두더라도 모든 페이지에 모든 사용자가 접근이 가능할 것이다.
⭐ 반드시 구체적인 URL부터 접근 권한을 부여할 것!

3. 커스텀 로그아웃 페이지 지정하기

로그인과 같은 과정이므로 설명은 생략!!

💡 현재는 InMemory에 저장된 사용자 데이터를 이용해 구현하고 있다. 그런데 매번 이렇게 코드에 사용자 정보를 입력해줘야 할까? 사용자가 회원가입 시 자동으로 데이터베이스에 사용자 정보가 저장될 수 있도록 데이터베이스와의 연동이 필요하다!

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글