SpringBoot - 5. 스프링 시큐리티

회원 관리시 인증 에 대한 처리를 해줘야한다 .

만약 로그인한 계정이 관리자이면 관리자 페이지로이동하도록 이라던가

관리자만 공지사항 글 작성할수 있다던가 그런부분을 

JSP/servlet 프로젝트시 session 을 이용해 작업해왔다.

그런데 스프링 의 시큐리티 이용하면 좀더 보안에 가까운 작업을 진행할수 있다.

 

스프링 시큐리티란?

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안 을 담당하는 스프링 하위 프레임워크다.

스프링 시큐리티는 인증과 권한에 대한 부분을 필터 흐름에 다라 처리하고 있다. 필터 는 디스패처 서블릿으로 가기전 에 적용 되므로 가장먼저 url 요청을 받고, 개발자 입장에서 일일히 보안 관련 로직을 작성하지 않아도 자동처리가 된다는 장점이있다.

 

스프링 시큐리티를 사용할려면 부트생성시 시큐리티 포함시켜 작업해줘야한다.

 

스프링 시큐리티 설정 

스프링 부트 프로젝트 생성후 스프링 시큐리티엔 대한 설정을해줘야한다 .

그전에

 

Mybatis 라던가 jdbc에 관한 설정도 해야한다.

 

우선 application.yml은 다음과같이 설정하였습니다.

# server port config
server:
  port: 8800
  
# oracle driver config
spring:
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521:xe
    username: login_auth
    password: login_auth

# mybatis config
mybatis:
  mapper-locations: mappers/**/*.xml

 

그리고 MyBatisConfiguration.java

설정은 다음과같다.

package com.memory.security.configuration;

import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(basePackages = {"com.memory.security"}, annotationClass = Mapper.class)
public class MyBatisConfiguration {

}

 

인제 시큐리티에 관한 설정파일입니다.

SpringSecurityConfiguraion.java

package com.memory.security.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import com.memory.security.member.model.service.MemberService;

@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter{

	private MemberService memberService;
	
	public SpringSecurityConfiguration(MemberService memberService) {
		this.memberService = memberService;
	}
	
	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

	@Override
	public void configure(WebSecurity web) throws Exception {
		web.ignoring().antMatchers("/css/**", "/js/**", "/images/**");
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.csrf().disable()
			.authorizeRequests()
			.antMatchers("/menu/**").authenticated()
			.antMatchers(HttpMethod.GET, "/menu/**").hasRole("MEMBER")
			.antMatchers(HttpMethod.POST, "/menu/**").hasRole("ADMIN")
			.anyRequest().permitAll()
		.and()
			.formLogin()
			.loginPage("/member/login")
			.successForwardUrl("/")
		.and()
			.logout()
			.logoutRequestMatcher(new AntPathRequestMatcher("/member/logout"))
			.deleteCookies("JSESSIONID")
			.invalidateHttpSession(true)
			.logoutSuccessUrl("/")
		.and()
			.exceptionHandling()
			.accessDeniedPage("/common/denied");
	}
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(memberService).passwordEncoder(passwordEncoder());
	}
}

위의 코드를 설명하겠습니다.

 

1. 스프링 시큐리티 설정 활성화 및 Bean에 등록 한다는 애너테이션 설정입니다.

 

2. 시큐리티 암호화 메소드를 사용하기위한 상속 처리

3. 로그인 처리를 어느 클래스파일에서 처리를할것인지 선택하는부분

4. 암호화에 사용 될 객체 

   존재하는 메소드는 아래와 같다

 - encode() : BCrypt 해싱 함수를 사용해서 비밀번호를 인코등 해주는 메소드

                 salt를 지원하여 똑같은 비밀번호를 인코딩 하더라도 매번 다른 인코딩 된 문자열을 반환해준다

 - matchers(rawPassword, encodePassword) : 사용자에 의해 제출 된 비밀번호와 저장소에 저장 되어 있는 비밀번호의 일치여부를 확인해주는 메소드

 

객체를 빈에 등록하는 행위 입니다.

 

5. 정적 관련 파일 접근 설정

정적 관련 파일등 js, css, image 등등 비로그인,로그인 상태일시 언제든지 접근가능하도록 설정하는 메소드

 

6. HTTP 요청에 대한 설정

아래 메소드에서 요청 을 설정하는 부분*중요

 

csrf에 대한 보안을 끄겠다는설정(임시로 꺼놨음 설정할부분이많아서)

요청에 대한 권한 체크를 하겠다는 설정

요청 보안 수준의 세부적인 설정 을 하겠다는 의미 

/menu/** 요청은 인증 되어야 접근가능을 의미

더 상세하게 /menu/** 의 Get요청은 ROLE_MEMBER 권한을 가진 사람에게만 허용하고

Post요청은 ROLE_ADMIN 권한을 가진 사람에게만 허용한다는 의미

hasRole 안의 값 앞에는 자동으로 ROLE_ 가 붙음

그외의 요청은 누구나 허용한다는 의미

그리고 로그인 설정

로그인 페이지는 /member/login 설정하고

로그인 성공시 /로 이동하라는 의미

로그아웃 설정

로그아웃 요청주소

JESSIONID 쿠키 삭제

세션 삭제(만료)

로그아웃 성공시 / 페이지로 이동하라는 의미

 

권한이 없을때 이동되는 페이지 설정

 

7. 스프링 시큐리티 모듈 설정 

로그인 로그아웃은 Controller에 작성하지 않고 스프링 시큐리티 모듈을 통해 처리한다.

유저 인증을 위해 사용할 Service 등록후 사용하는 패스워드 인코딩 방식을 설정한다.

 

 

우선 기본적은 설정은 위와 같습니다 .

다음에는 화면을통해 같이 구현해보도록하겠습니다 .

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유