능글맞은 구렁이
SpringBoot-SECURITY 본문
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
'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 |