2018년 4월 20일 금요일

패스트 캠퍼스 JAVA 웹 프로그래밍 마스터 20일차(Spring Boot, Spring Security)

  • 재구동 없이 실행
    • runtime('org.springframework.boot:spring-boot-devtools')가 있으면 build만 해도 된다. WAS를 재구동 안해도 된다.
  • Gradle 명령어로 작업하기
    • 실행가능한 jar파일 만들기
      gradle jar
      ---> Build/libs/simpleboard-0.0.1.SNAPSHOT.jar
    • 해당 jar 파일을 실행하기
      cd build/libs/
      jar -jar simpleboard-0.0.1.SNAPSHOT.jar
      종료 : ctrl + c
  • Spring boot 설정
    • jar의 표준이 없다. Spring에서 실행가능한 jar를 만들기 위한 새로운 방법을 만들었다.
      스프링 부트 플러그인(maven, gradle)을 이용하여 jar로 만들어야 한다.
    • Spring boot에서는 webapp폴더아래에 파일을 작성하지 않는다.
    • 정적인 리소스는 src/main/resources/static 폴더에 넣는다.
      타임리프 관련된 템플릿은 src/main/resources/templates 폴더에 넣는다.
    • Spring Security를 추가한다. 
      • WebSecurityConfigurerAdapter 를 상속받아서 기능을 확장할 수 있다.
      • compile('org.springframework.boot:spring-boot-starter-security')
      • 모든 경로를 로그인해야만 접근할 수 있다.
      • 기본 사용자가 추가된다. 사용자 id : user, 암호는 부트 애플리케이션이 실행될 때 출력된다.
  • Spring Security
    • 서블릿 필터는 빈이 아니다. WAS에서 생성해 준다. 
    • 스프링 컨테이너에는 10개이상의 시큐리티 관련 객체를 가지고 있는데 Spring을 개발한사람은 bean으로 관리되기를 원했다. 그래서 스프링 시큐리티가 제공해주는 필터를 넣어 준다. 이 필터는 스프링 관련 필터이기 때문에 시큐리티 관련 객체를 사용할 수 있다.
    • 빈은 컨테이너가 관리하는 것을 말한다.
    • 스프링이 빈으로 관리하는 필터가 있다.
    • FilterChainProxy를 통해 스프링 빈에서 관리하는 필터를 사용한다.
    • Spring Security Filter Chain을 추가 및 교체할 수 있다.
    • Spring에서는 설정해야 할 부분이 많다. boot에서는 간단해진다.
    • org.springframework.boot.autoconfigure.security.StaticResourceLocation 에 css, javascript, images, webjars, FAVICON 의 path가 정해져있다.
    • 로그인을 검사하는 필터가 있다. 
      • 컨트롤러를 만드는게 아니다. 
      • path도 정해줘야한다. 
      • db정보와 검사해주는 객체가 있다.
      • 권한(ROLE)을 부여해준다. 사용자아 권한은 1:N 관계
      • 사용자가 가려고 했던 path로 이동해준다. 
      • 정보가 맞으면 세션을 저장해준다.]
      • 필터에서 로그인 인증후 브라우저에게 path를 리다이렉트 한다.
    • 로그아웃을 검사하는 필터가 있다. 
      • 컨트롤러를 만드는게 아니다
      • 로그아웃후에 이동할 경로가 설정에 있다.
      • 필터에서 로그아웃 처리후브라우저에게 path를 리다이렉트 한다.
  • Spring Security 옵션
    • 설정한 순서대로 옵션이 적용된다.
    • AntPathRequestMatcher : Ant관련 path 설정
    • permitAll() : 인증을 안하고 아무나 볼 수 있다.
    • PathRequest.toStaticResources().atCommonLocations()).permitAll() : static 폴더 안에 폴더 기준에 맞게 파일을 넣고 그 폴더들은 인증을 안한다.(Spring boot에서 제공한다.) 
    • .anyRequest().fullyAuthenticated() : 등록한 url 인증이 있어야 접근 가능
    • hasRole : 해당 롤 권한만 접근 할 수 있다.
    • ..antMatchers("/h2-console/**").permitAll().and() .csrf().ignoringAntMatchers("/**") // .ignoringAntMatchers("/h2-console/**") .and().headers().frameOptions().disable() :  H2 DB를 사용할때 설정
    • .and().logout().permitAll() : 로그아웃은 누구나 접근 가능
    • .and().formLogin() : 시큐리티가 제공하는 로그인 폼 사용
    • .and().formLogin().loginPage("/uers/login").usernameParameter("id").passwordParameter("password") : 로그인 페이지를 변경하려고 할때 post방식으로 '/uers/login' 으로 input name을 id, password 로 설정하고 보내야한다.  (get 방식은으로 요청하면 UI페이지로 가고 post방식으로 요청하면 스프링 시큐리티에게 요청된다.)
  • JPA 에서 1:N 관계 설정
    • 패러다임 문제 해결 : OOP(객체 모델l)와 관계형 데이터베이스(관계 모델)는 같은 데이터를 표현하고 다루는 방법이 차이가 나는 문제를 해결
    • users - user_role 테이블 (1 : N)
    • users 테이블에서
      @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "user_id")
      private List<UserRole> roles;
    • JSON으로 반환할때 제거하고 보여준다.
      @JsonIgnore
      private String password;
    • pk로 지정하고 자동으로 값을 증가한다. 자동증가를 사용하지 않으면 key가 있는지 select문을 실행하기 때문에 성능이 느리다.
      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
  • Spring boot 에서 암호화
    • 암호화의 종류는 많다. 기본으로는 bcrypt알고리즘을 사용한다.
    • PasswordEncoder가 '{암호화종류}암호화한내용' 으로 저장한다.
      PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
      passwordEncoder.encode(user.getPassword());
  • thymeleaf
    • th:object= "${객체}" : 객체를 셋팅한다
    • th:field= "*{객체의필드명}" : 가져온 객체의 필드를의 값을 가져온다.
    • th:action ="@{path} " : contextpath를 path 앞에 붙여준다.
  • Hibernate
    • 두개의 테이블이 관계를 맺고있을때 insert할떄 FK를 제외하고 insert한다음에 FK의 정보를 업데이트한다.
    • Hibernate: insert into users (id, email, name, password, regdate) values (null, ?, ?, ?, ?)
      Hibernate: insert into user_roles (id, role_name) values (null, ?)
      Hibernate: update user_roles set user_id=? where id=?
  • spring data method query
    • 메소드 이름은 find로 시작한다.
      public User findUserByEmail(String email)
      user테이블에서 입력한 이메일에 맞는 조건을 찾는다.( where email = :email)
  • Spring Security 인증관련 로직 변경
    • Spring boot는 UserDetailsService를 Implement 객체를 이미 가지고 있다.
    • 인증관련 로직을 변경 하려면 UserDetailsService를 Implement 하는 클래스를 만들고.
      @Componet로 등록한다.
    • Principal를 통해 로그인 정보를 출력할 수 있다.
      SecurityContextHolder.getContext().getAuthentication() 를 통해서도 출력할수 있다(Thread local로 구현되어 있고 시큐리티가 SecurityContextHolder에 넣어준다.)
    • JdbcTokenRepositoryImpl 는 remember me 를 해주는 기능이다.
Share:

0 개의 댓글:

댓글 쓰기