[2023.01.18] 개발자 교육 82일 차 : 강의-SpringSecurity, React&Redux 학습 [구디 아카데미]

DaramGee·2024년 1월 18일
0
post-thumbnail

강의 내용

security-step1

권한부여(User, teacher, manager, admin)
권한 별 페이지 접근 가능 페이지 설정

  • SecurityConfig.java

  • 메소드
    - webSecurityCustomizer() : WebSecurityCustomizer => Spring Security에게 정적 리소스에 대한 요청을 무시하도록 지시, 정적 리소스를 처리할 수 있도록 설정
    - filterChain(HttpSecurity http) : SecurityFilterChain => 권한, 권한별 페이지 설정
  • 메소드 filterChain(HttpSecurity http)
    - auth 권한 설정(Id, pw, roles) - user/teacher/admin
    - http 페이지별 권한계정 설정 - 페이지별 권한 매치 or 모든 접근 허용(.permitAll())
    - role에 맞게 항목은 더 추가할 수 있음(단, 어느정도 개발이 진행되고 나중에 추가하면 됨, 초반에 추가하면 불편함)
    - ROLE_ADMIN("SUPER") > ROLE_MANAGER("TEACHER") > ROLE_TEACHER > ROLE_USER
    - 권한에 따라 표시되는 메뉴가 진다? -> 세션, 쿠키의 처리 필요(권한이 페이지별로 유지되어야 하니까)
	@Bean  
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {  
			AuthenticationManagerBuilder auth = http.getSharedObject(AuthenticationManagerBuilder.class);  
				auth  
				.inMemoryAuthentication()  
				// 보안상 안전하지 않으니 쓰지 말것을 당부하며 지원은 끊지 않겠다는 설명  
				.withUser(  
							User.withDefaultPasswordEncoder()  
											.username("user")  
											.password("1")  
											.roles("USER"))  
				.withUser(  
							User.withDefaultPasswordEncoder()  
											.username("teacher")  
											.password("1")  
											.roles("TEACHER"))  
				.withUser(  
							User.withDefaultPasswordEncoder()  
											.username("manager")  
											.password("1")  
											.roles("MANAGER"))  
				.withUser(  
							User.withDefaultPasswordEncoder()  
											.username("admin")  
											.password("3")  
											.roles("ADMIN"));  
			http  
				.csrf(AbstractHttpConfigurer::disable)  
				.authorizeHttpRequests(requests -> requests  
				.requestMatchers("/user/**").authenticated()// 인증되면 들어가는 주소 
				.requestMatchers("/admin/**").hasRole("ADMIN")  
				.requestMatchers("/login").permitAll()  
				.anyRequest().authenticated())  
				.formLogin(login -> login  
				.loginPage("/login")  
				.loginProcessingUrl("/loginProcess")  
				.defaultSuccessUrl("/", true)  
				.permitAll())  
				.logout(logout -> logout  
				.permitAll());  

			return http.build();
  • ViewController : 페이지 구현

  • @RequestBody 의미를 아나?(public String index() vs public @ResponseBody String user())
    - 클라이언트와 서버가 비동기 통신으로 요청을 할 때 그 본문의 body 담긴 데이터를 객체로 변환할 때 사용되는 것이 body(본문)이다.
    - 즉,Body에 담겨 보내지는 값의 유무에 따라 이 어노테이션의 사용여부가 정해진다.

security-step2

로그인 에러 시 처리 설정
권한 별 페이지 접근 가능

  • 에러페이지 설정

  • 흐름 : 에러발생 -> 스프링으로부터 페이지 인터셉트 -> 개발자가 정해둔 에러페이지로 이동
  • Jsp 어디에 위치? WEB-INF에 위치!!
  • 어디에 설정이 필요한가? SecurityConfig에 설정 필요(요청 url) & ViewController
    .formLogin(login -> login  	.loginPage("/login")  
    		.loginProcessingUrl("/loginProcess") //로그인 버튼 요청 시  
    		.failureUrl("/login-error")//로그인 실패 시(요청 url)                
    		.defaultSuccessUrl("/", true)  
    		.permitAll())
@GetMapping("/login-error")  
public String loginError() {  
    return "loginError";  
} //jsp 이름과 같아야함!! 반드시 확인


(리액트 & 리덕스 학습)

  • [[Flux]]??

  • 단방향으로 데이터가 흐르게 할 수 있는 아키텍쳐 아이디어 (투웨이의 단점 보완)
  • 핵심키워드

  • One way 아키텍쳐(단방향 데이터 흐름)
  • 상태 : 변하는 데이터값, 데이터는 바뀌기 때문에 상태라고 함.
  • 액션 : 어떤 데이터를 어떤 것으로 바꿀 것이라는 시그널
  • 디스페쳐 : 스토어로 전달하는 도구 역할
  • 스토어 : 전달되는 장소
  • 참고 사이트 (https://velog.io/@andy0011/Flux-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80)

One way vs Two way
Two way의 경우, UI와 상태가 상호작용, 잘못 바뀌는 부작용, 떨어지는 성능 등 => One way

  • 프로젝트 생성([[redux_practice]])

  • Redux? 상태 관리 라이브러리
  • 리액트는 상태관리를 프롭스를 통해 전달하며 진행한다.
  • 컴포넌트가 많아지면 그 깊이가 깊어지고, 전달하기 위해 여러 단계를 거쳐야하는 비효율성이 야기된다.
  • 이러한 비효율성을 줄여주는 라이브러리가 바로 Redux!!

Spring 복습하기![[webapp & WEB-INF]]


  • 주 어노테이션 설명 내용 써보기

  • @Controller : 페이지를 리턴할 때 사용하는 어노테이션, Model과 함께 사용, 클래스 선언 앞 자리
  • @RestController : 문자열 리턴할 때 사용 & json으로 데이터 오감, 클래스 선언 앞 자리(리액트와 같이 사용)
  • @GetMapping @PostMapping @PutMapping @DeleteMapping
  • @ResponseBody : 응답이 문자열(text/plain, application/json)일 때 사용, 메소드에서 사용된다.
  • @Autowired : 클래스 간 관계 맺는 역할, [[DI]] (Controller -> Logic -> VO -> Sqlsession Template)

  • MVC 패턴 구성 시 사용 되는 어노테이션

  • @Controller : 컨트롤러는 사용자의 요청을 처리하고 해당하는 뷰 또는 데이터를 반환

  • @RestController : 배포위치 상관없음. 왜?? 반환값은 문자열(text, json 등) 뷰랜더링이 아닌 데이터 반환

  • @Service : 비즈니스 로직이 포함된 서비스 클래스(데이터 처리, 계산, 유효성 검사)

  • @Repository : 데이터 액세스 객체를 나타내며, 주로 데이터베이스와의 상호 작용을 담당, 주로 @Service에서 사용되어 데이터베이스와의 통신을 추상화하고 예외를 처리하는 데 도움

    Spring은 패턴학습이다. MVC패턴에 대한 구조 조직화

0개의 댓글