능글맞은 구렁이

SpringBoot-SECURITY 본문

Framework/SpringBoot

SpringBoot-SECURITY

보라색츄르 2021. 7. 19. 22:32

1. SECURITY

1. security활용

  1) 인증 : 사용자 식별

      예) 사원이 회사 건물 들어가기 위해 사원증, RFID 카드를 이용하여 반드시 인증을 통과.

  2) 인가 : 시스템 자원에 대한 접근 통제

      예) 직급, 직무에 다라 부여된 권한이 다르기 때문에 회사내에서 열람할 수 있는 문서의 종류도 제한.

      직원이 특정 자원에 접근할 때 적절한 권한이 있는 지를 확인하는 과정.

 

2. 스프링 security 

  1) 기존방법 : 세션(HttpSession) 을 기반으로 로그인 에 성공한 사용자만 글등록, 목록 검색.

 

  2) 스프링 부트에서 security사용방법

     - 스프링 시큐리티를 쉽게 사용할 수 있도록 시큐리티 스타터를 제공

     - 프로젝트에 적용하면 시큐리티 관련 의존성, 복잡한 시큐리티 관련 설정들들 자동으로 처리..

 

  3) 스프링 시큐리티를 사용하는 이유

    - 인증, 인가 관련된 코드를 모든 클래스들의 메서드마다 적용 시, 반복적인 코드가 발생하고 유지보수가 힘들지만

      security를 사용하면 편리하다.

    - 스프링 부트에서 시큐리티 스타터를 추가하면 security관련 의존성들이 추가되고, 관련 설정들도 동작된다.

 


2. STS를 활용한 SECURITY방법

 

1. 새 프로젝트 생성(File => New => Spring Starter Project)

※참고 : 서버 충돌이 난다면 application.propertise부분에 server.port=포트번호 를 작성해준다.

 

 

 

2. hello.html생성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	확인용 텍스트 입력
</body>
</html>

 

 

 

3. security적용이 안되었을 경우 (security start X)

     ~~Application.java => Run => Spring boot

     console 오류 : Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource

     이유 : 스프링 부트는 애플리케이션이 시작될 때, 필요한 기본 설정 들을 자동으로 설정하도록 설계되어 있다.

         그 중, DataSource 설정이 자동 구성 될 때, 필요한 데이터베이스 정보가 설정되지 않아 발생하는 오류이다.

         따라서, 지금 바로 데이터베이스를 사용하지 않을 경우에는 

         ~~Application.java 파일의 

         @SpringBootApplication 아래에

         @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 를 추가하면 해결된다.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class JbrApplication {
	public static void main(String[] args) {
		SpringApplication.run(JbrApplication.class, args);
	}
}

 

 

 

3. security적용이 되었을 경우  (security start O)

   1) security 스타터 추가 방법(처음 프로젝트 생성시 security추가를 안했다면)

       ㄱ) pom.xml 문서 가장 마지막 </dependency> 아래 줄에서 CTRL+SPACE 

       ㄴ) 맨 아래 메뉴중 Edit Starter  더블클릭 후 => Spring Security 추가한다.

<properties>
	<java.version>1.8</java.version>
	<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version><!--추가-->
</properties>

       ㄷ) Application.java 재 실행 

            웹 브라우저에서 ~~~/hello.html 재요청 하면 웹 주소줄 : ~~~~/login 으로 변경 되면서

            사용자 인증화면이 출력된다.

       ㄹ) 이 때 사용자 인증을 하려면 콘솔창의 메시지 아래부분을 확인..

            Using generated security password: cc85d1c2-3e77-4609-9332-435c50d61208

            security password를 값을 복사 한 후,  Username : user    Password : security password를 값을 입력하고 

            Sign in 버튼을 클릭하면 인증 완료 시, hello.html 화면이 출력되고,  인증이 실패하면 사용자

            인증화면이 계속 출력된다.

            ※참고: security password는 실행할때마다 변경된다.

 

 

 

4. security 관련된 로그까지 확인 하기

       ㄱ) application.properties 파일내에  시큐리티 관련 로그를 debug로 설정 해야 한다..
       ㄴ) logging.level.org.springframework.security=debug와 같이 추가 하면 된다..

application.properties 

## Server Port Setting
server.port=~~~

## WebApplication Type Setting
spring.main.web-application-type=servlet

## Thymeleaf Cache Setting
spring.thymeleaf.cache=false

## Security log level Setting
logging.level.org.springframework.security=debug

 

 

 

5. security커스터 마이징

 

1)시큐리티 설정 파일 작성

※경로: src/main/java => 기본패키지 =>  config 패키지 추가 => SecurityConfig.java 생성※

      ㄱ)SecurityConfig 은 WebSecurityConfigurerAdapter 를 상속 =>  WebSecurityConfigurerAdapter 은

      다양한 설정을 추가할 수 있는 configure() 메서드를 보유 

      따라서 SecurityConfig에서 해당 메서드를 재정의함으로서 시큐리티 설정을 커스터마이징 할 수 있다.

          a) configure()는  HttpSecurity 객체를 매개변수로 전달받는데,  HttpSecurity 객체를 이용하여

            애플리케이션 자원에 대한 인증과 인가를 제어할 수 있다.

      ㄴ) SecurityConfig위에는 @EnableWebSecurity 어노테이션을 추가 이 클래스로부터 생성된 객체는 시큐리티

      설정 파일임을 의미. 동시에 시큐리티를 사용하는데 필요한 수많은 객채들을 생성한다.

2) 요청 URL 에 따라 요청을 응답할 수 있는 컨트롤러 생성

/**SecurityController.java**/
public class SecurityController{

	@GetMapping("/")
	public String index(){
		System.out.println("index 요청입니다.");
		return "index";
	}

	@GetMapping("/member")
	public void forMember(){
		System.out.println("Member 요청입니다.");
	}
	
	@GetMapping("/manager")
	public void forManager(){
		System.out.println("Manaager 요청입니다.");	
	}
	
	@GetMapping("/admin")
	public void forAdmin(){
		System.out.println("Admin 요청입니다.");
	}
}

3) 시큐리티 구성 화면

      ㄱ) 요청 URL "/"   : 인증하지 않는 모든 사용자가 접근 가능

      ㄴ) 요청 URL "/member"   :  인증을 통과한 사용자만 접근 가능

      ㄷ) 요청 URL "/manager"   :  인증을 통과 했고, MANAGER 권한을 가진 사용자만 접근 가능

      ㄹ) 요청 URL "/admin"   : 인증을 통과했고, ADMIN 권한을 가진 사용자만 접근 가능

/**SecurityConfig.java**/

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

	@Override
	protected void configure(HttpSecurity security) throws Exception{
		security.authorizeRequests().antMatchers("/").permitAll();
		security.authorizeRequests().antMatchers("/member/**").authenticated();
		security.authorizeRequests().antMatchers("/manager/**").hasRole("MANAGER"); 
		security.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN");
		security.csrf().disable(); 
	}
}

 

      ㅁ) configure( ) 메서드 재정의 내용

           a) 특정 경로에 대한 권한을 가진 사용자만 접근을 허용할 경우, AuthorizedUrl 객체의 메서드를 이용.

               AuthorizedUrl은 HttpSecurity의 authorizeRequests() 를 호출할 때 리턴되는

               ExpressionInterceptUrlRegistry의 antMatchers() 메서드를 통해 얻어낸다.

          b) authorizeRequests() : 사용자 인증, 권한 설정

          c) antMatchers("url 패턴") : 매칭되는 URL 패턴들에 대한 접근 허용

              - permitAll() : 모든 사용자에 대한 접근 허용

              - hasRole("권한이름") : 특정 권한을 가진 사용자만 접근 허용

         d) 모든 사용자에게 접근 권한을 부여할 경우 : AuthorizedUrl의 permitAll() 를 이용하여 접근 허가.  

         e) formLogin() : 로그인(인증) 페이지 설정

             - loginPage("URL 패턴") : 로그인이 필요한 url로 접근하면 URL 패턴 화면으로 이동

             -  defaultSuccessUrl("/loginSuccess", true) : 인증 로그인이 성공하면 이동할 URL 패턴

            * 인증이 되지 않은 사용자가 시스템 자원에 접근할 경우, 브라우저는 /login 요청을 리다이렉트하여

              인증이 성공할 수 있도록 한다.  따라서 컨트롤러에는 /login을 처리할 수 있는 메서드가 필요.

              

  4. logout() : 로그아웃 페이지 설정 

        * 스프링 시큐리티의 인증 처리 방식은 기본적으로 HttpSession 을 이용.

        * 따라서 브라우저가 종료되면 해당 세션도 자동으로 종료..

        * 만약 브라우저를 종료하지 않고, 세션을 종료하려면 사용자가 로그아웃 요청을 하고,

          서버는 해당 세션을 강제로 종료..

        => invalidateHttpSession(true) : 현재 브라우저와 연관된 세션을 강제 종료.

        => logoutSuccessUrl("URL 패턴") : 로구아웃 후 이동할 화면으로 리다이렉트.  

  

  5. exceptionHandling() : 접근 권한이 없어 예외처리 되었을 때

         => accessDeniedPage("URL 패턴") : 권한이 없어 해당 페이지를볼 수 없다는 매시지를 출력할 수 있도록 요청할 URL을 설정.

          

 

컨트롤러 실행 시, 아래 보안 비밀번호 인 증 시, 필요...

Using generated security password: 3113fa57-8649-4088-a5ef-001ffc468b17

http://localhost:9009/  요청 => index.html

http://localhost:9009/member  요청 => login.html => 인증 성공 => loginSuccess.html

http://localhost:9009/admin  요청  =>

http://localhost:9009/manager  요청 =>

'Framework > SpringBoot' 카테고리의 다른 글

AssertJ  (0) 2021.07.23
SpringBoot-Thymeleaf(URL)  (0) 2021.07.20
SrpingBoot-목록 데이터페이지 처리  (0) 2021.07.13
guestbook 프로젝트 - 구조만들기  (0) 2021.07.09
SpringBoot-Thymeleaf(레이아웃)  (0) 2021.07.09
Comments