수업내용/Spring

[2023.1.25.수] 스프링 시큐리티 빌드패턴, spring-security 프로젝트 생성

주니어주니 2023. 1. 25. 17:06

 

 

 

 

 

* CustomSecurityConfig 객체에는 3가지 메소드가 있음

- HttpSecurity 를 매개변수로 받는 configure 메소드

- WebSecurity 를 매개변수로 받는 configure 메소드

- AuthenticationManagerBuilder 를 매개변수로 받는 configure 메소드 

 

 

 

 

 

객체의 초기화 

 

1. 생성자 메소드 

 

  • 생성자 메소드를 이용하는 객체의 초기화의 문제점 
    • 객체를 초기화하는 방법이 다양한 경우, 해당 경우의 수만큼 생성자  메소드를 중복정의 해야 한다. 
    • 초기화하는 과정에서 전달되는 값을 서로 다르지만, 타입이 동일한 경우 생성자 메소드 중복정의로 해결할 수 없다. (같은 타입의 같은 생성자 메소드 이름 X)
      - public Sample(String url, String username) { ... }
      - public Sample(String username, String password) { ... } 
      ( 둘다 매개변수의 개수가 2개, 타입이 String 이면 중복정의할 수 X ) 

 

2. setter 메소드

 

 

  • Setter 메소드를 이용하는 객체의 초기화의 문제점
    • Setter 메소드가 public 메소드이기 때문에 객체의 생성직후 Setter 메소드로 초기화가 완료된 이후에도 Setter 메소드를 실행해서 객체의 값을 변경할 수 있는 위험성이 존재한다. 

 

 

3. 빌더 메소드 ( 빌더 패턴 ) 

 

 

 

return this -> SampleBuilder 객체를 그대로 반환 -> .메소드() 로 계속 이 객체의 메소드를 메소드체이닝 가능

setter가 없기 때문에 -> 객체를 한번 초기화하면 바꿀 수 없어 

추가적인 메소드의 구현 없이 , 빌드로 다양하게 조합해서 해결 가능 

처음 세팅한 대로 유지 (값 못바꿈) - Builder를 생성해서 User객체에 값을 넣고 build() 메소드를 실행할 때만 바꿀 수 있음 

원하는 조합으로 언제든지 만들 수 있음 + 값 변경 불가 

 

 

 

예시) 

 

User 객체 생성 

 

 

User 객체 안에 Build 클래스 생성 

- User 객체의 컬럼(변수)과 똑같이 변수 생성

- Builder 객체를 그대로 반환하는 메소드를 각 변수마다 생성

- Builder의 정보들로 User 객체를 만드는 build() 메소드 생성  

 

 

App 객체에서 빌드패턴 초기화 실행

- User user = new User(); 로 User 객체를 생성할 수 X ( private 설정 되어 있음 )

-> User 의 Builder 생성자 메소드 실행 -> Builder 객체 생성

-> Builder의 메소드 실행 -> build() 메소드 -> User 객체 생성

 

 

 

 

=> CustomSecurityConfig 객체가 바로 빌드 방식으로 초기화한 것 

 

 

CustomSecurityConfig (빌더 패턴) 

 

 

 

 

* 값을 초기화하는 메소드 체이닝 설명 

 

 

http객체의 csrf 메소드 실행 -> CsfgConfigurer 객체 반환

-> 이 CsfgConfigurer  객체에는 disabled() 메소드가 있음 (enabled 를 false로 변경하고 HttpSecurity 객체를 반환)

-> 이 HttpSecurity 객체의 메소드에는 authorizeHttpRequests() 가 있음 -> 객체 반환 

-> 이 객체의 메소드에는 antMatchers() 가 있음 -> 객체 반환 

------> 메소드 체이닝 

 

 

 

 

CSRF (Cross-Site Request Forgery : 사이트 간 요청 위조) 

: 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격

  ( 요청위조 : 공격자가 악성코드 공격을 다른 사람이 한 것처럼 위조하는 것 ) 

 

 

 

-> csrf 토큰을 숨겨서 게시글 등록화면에서만 토큰이 함께 보내짐 -> 세션객체의 토큰과 비교해서 일치해야 함 

( 세션객체마다 각각 다른 토큰이 들어가 있음 ) 

-> 게시글 조회에서 요청 위조를 통해 게시글을 등록하면 토큰이 안보내짐 -> 요청 거부 

 

 

 

 

 


 

Spring Security 연동 

 

1. spring boot 프로젝트 생성 

 

 

 

2. 의존성 추가 

 

버전은 일단 2.7.8로 만들어서 pom.xml에서 2.6.7 버전으로 수정

 

 

 

3. pom.xml 파일 편집 

 

1) 스프링 부트 버전 변경 : 2.6.7

 

 

2) jsp용 spring-security-tag 라이브러리 의존성 추가

 

 

3) spring-boot-starter-tomcat 라이브러리는 삭제 혹은 주석처리, jsp를 지원하는 내장형 톰캣 라이브러리 의존성 추가 

 

 

4) jstl 태그 라이브러리 의존성 추가 

 

 

 

4. 사용자, 사용자 권한 테이블 생성 

 

 

 

5. 데이터베이스 액세스 작업에 필요한 파일 정의

VO 클래스

          User.java, UserRole.java

mybatis mapper 인터페이스

          UserMapper.java, UserRoleMapper.java

mybatis mapper 파일

          users.xml, user-roles.xml

* 사용자 정보 추가, 사용자 정보 조회 관련 기능 정의 

 

 

 

6. UserDetails 인터페이스를 구현한 사용자정의 UserDetails 클래스 정의 

 

- LoginUser.java

  ( 아이디, 비밀번호, 이름을 표현하는 클래스 ) 

 

 

 

- CustomUserDetails.java

  ( username(사용자식별정보), password(암호화된 비밀번호), authorities(보유권한정보)와 기타 정보 제공 )

 

 

그 외 추상메소드들은 전부 true를 반환하도록 재정의

 

 

7. UserDetailsService 인터페이스를 구현한 사용자정의 UserDetailsService 클래스 정의 

- 전달받은 사용자 식별정보로 사용자정보를 조회해서 사용자정의 UserDetails 객체에 담아서 반환

 

 

 

8. spring boot 프로젝트의 Bootstrap 클래스에 PasswordEncoder 빈 추가

 

 

 

9. WebSecurityConfigurerAdapter 클래스를 상속받아서, 사용자정의 spring-security 설정 클래스 정의 

* CustormSecurityConfig.java 

 

 

 

 

 

 

- 회원가입하기 

 

 

- 로그인하기 

 

 

 

- 로그아웃하기 

 

 

 

- 컨트롤러에서 인증된 사용자정보 이용하기

 

 

 

- JSP에서 인증된 사용자정보 이용하기 

 

tag.jsp