개발가능구역

[ IntelliJ ] Spring Security 로그인 01 본문

SpringBoot/IntelliJ

[ IntelliJ ] Spring Security 로그인 01

oosomall 2025. 9. 30. 15:44
반응형

 

 

로그인은 개인의 계정을 입력하여 권한을 얻는 행위이다

앞전 유효성 검사는 그 계정을 만들기 위한 페이지를 구현하기 위함이었고, 

이제부터는 로그인을 공부해보려 한다

 

 

아직 초심자라 모르는 부분 투성이지만 차근차근 해보려 한다

 

 

 


 

🔴 목 차

 

1. 작업 툴

2. 의존성 추가

3. SecurityConfig

 - 설정 클래스

 - 접근 권한 설정

 - 로그인 완료 설정

 - 로그아웃 완료 설정

 - 비밀번호 암호화

 

 

 


 

 

🔴 작업 툴

 

IDE : IntelliJ

웹 서버 : Apache

UI : HTML5, Thymeleaf

사용 클래스 : Config

사용 DB : Oracle

 

 

 


 

 

 

🔴 의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'

 

우선 build.gradle 에 해당 코드를 넣어준 후 오른쪽에 코끼리가 뜨는 클릭하고, 실행을 한다

이제 localhost 웹 페이지를 들어가면 사진과 같은 이미지가 떠서 상당히 당황했다

 

 

이제 이 문제를 해결하기 위해 설정 클래스를 만들것이다

 

 


 

 

 

🔴 SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/", "/sign_up", "/css/**", "/js/**").permitAll()
                        .anyRequest().authenticated()
                )
                .formLogin(form -> form
                        .loginPage("/login")
                        .defaultSuccessUrl("/")
                        .permitAll()
                );
        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

1️⃣ 설정 클래스

@Configuration 해당 클래스가 스프링 설정 클래스임을 표시
@EnableWebSecurity 스프링 시큐리티 필터 체인 활성화
@Bean 스프링 컨테이너에 빈으로 등록
객체 생성과 등록을 담당하는 메서드에 붙인다

 

참고로 @Configuraion 가 위고, @EnableWebSecurity가 아래이다

이렇게 안 하면 import가 안 됐다

 

2️⃣ 접근 권한 설정

.csrf().disable() CSRF 보안 토큰 기능 비활성화 (폼 로그인 테스트 편의용)
.authorizeHttpRequests(auth -> auth 특정 URL은 인증 없이 접근 허용
.requestMatchers( . . . ).permitAll()
그 외의 모든 요청은 로그인(인증) 필요
.anyRequest().authenticated() 권한 규칙을 안 준 모든 요청(any request) 로그인(인증) 필요

 

주로 Controller를 활용해서 data를 주고 받았는데

해당 매핑 주소에 권한을 주는 역할이다

Controller 뿐 아니라 외부 css폴더, js폴더 등도 등록할 수 있기에 권한 주기가 편해진다

 

  • csrf().fisable()
    • CSRF 공격 방지 기능을 끄는 것
    • 실서비스에서는 반드시 켜두고, hidden input으로 CSRF 토큰 처리 필요
    • 테스트 단계에서는 폼 전송이 안 막히도록 비활성화하는 경우가 많다
  • authorizeHttpRequests
    • 경로별 접근 권한 설정한다
    • 예) /sign_up, /signup_save는 로그인 없이도 접근 가능하게 한다
    • 나머지는 인증 필요
  • requestMatchers( . . . ).permitAll()
    • 특정 URL 패턴을 지정하여 접근 권한을 부여 하는 것
    • /css/**, /js/** → 정적 리소스(css, js 파일)도 로그인 없이 접근 가능
  • anyRequest().authenticated()
    • requestMatchers( . . . ) 외 모든 요청은 로그인 필요

3️⃣ 로그인 완료 설정

.formLogin(form -> form . . . ) 내가 만든 로그인 페이지 사용 (기본 시큐리티 로그인 화면 막기)
.loginPage("/login") 로그인 성공 시 이동할 페이지 (홈 화면 등)
.defaultSuccessUrl("/") 로그인 페이지 접근은 누구나 가능
.permitAll() 누구나 허용 가능

 

로그인 화면에서 ID, Password 입력 후에 로그인 버튼을 클릭 후

어디로 이동이 되는지를 표현한다

 

  • 로그인 관련 설정
  • loginPage("/login")
    • 기본 시큐리티 로그인 창을 막고, 내가 만든 /login 페이지를 사용
  • defaultSuccessUrl("/")
    • 로그인 성공 후 홈( 컨트롤러에서 홈 주소를 " / "으로 설정했다 )으로 이동
  • permitAll()
    • 로그인 페이지는 로그인 안 해도 접근 가능해야 하므로 허용

4️⃣ 로그아웃 완료 설정

.logout(logout -> logout . . . ) 로그아웃 성공 시 이동할 페이지
.logoutSuccessUrl("/") 로그아웃 URL 접근은 누구나 가능
.permitAll() 누구나 허용 가능
  • 로그아웃 처리
  • logoutSuccessUrl("/") 
    • 로그아웃 성공 후 홈으로 이동
  • permitAll()
    • 로그아웃은 누구나 실행 가능

5️⃣ 비밀번호 암호화

PasswordEncoder 비밀번호를 암호화/검증할 때 사용하는 클래스
new BCryptPasswordEncoder() 해시 방식
  • 회원가입 시 비밀번호를 DB에 넣을 때 반드시 이 인코더로 암호화해야 로그인 검증이 된다

 

 

 


 

 

 

 

이제 다시 실행을 돌리면

원래 작업하던 웹 페이지로 돌아온다

 

 

 

반응형