1. 프로젝트에 의존성 추가하기
1) 프로젝트 우클릭 후 Spring - Add Starters 클릭
2) 기존에 사용했던 의존성들 모두 체크 + 새로 추가할 의존성 체크 ==> next 클릭
* OAuth2 Client : 소셜 로그인(구글, 카카오, 네이버 로그인 등) 구현에 필요한 라이브러리
3) 기존 내용에서 변경되는 내용을 확인하는 화면
- 줄이 그어져 있는 부분을 클릭하면 [>] 표시가 나온다.
- [>] 표시를 클릭하면 변경된 내용을 현재 파일에 반영할 수 있다.
- 수정을 완료했으면 Finish 버튼을 클릭.
4) 변경이 완료되고 프로젝트의 build.gradle 파일을 열어보면 의존성 설정이 업데이트 된 것을 확인할 수 있다.
2. Spring Security
1) Spring Security 의존성이 추가되면 프로젝트를 Spring Boot App으로 실행시킬 때 이클립스 콘솔에 security password가 출력된다.
2) 그리고 아무런 설정을 하지 않아도 localhost로 접속을 해보면 로그인창이 표시된다.
3. Spring Security Configuration
1) src/main/java 하위에 config 패키지 생성
2) 생성한 패키지 하위에 SecurityConfig 클래스 파일 생성
* BCrypt : 패스워드 인코딩 알고리즘 중 하나
** 패스워드 인코딩 알고리즘에는 다양한 종류가 있다.
* inMemoryUser : 메모리 안에 있는... 즉, 메모리에서 관리하는 유저 상세정보 서비스라는 뜻
* 회원가입 페이지를 만들어야 DB에 유저 데이터가 생길텐데, 그렇게 하기 전에 먼저 Spring Security 테스트를 해보기 위해서 메모리 안에서만 사용할 사용자 객체를 생성/관리하는 것.
3) 앱을 재시작시켜보면 security password가 콘솔에 표시되지 않는 것을 볼 수 있다.
* [m] 사용자 객체를 만들어놨기 때문에 기본 비밀번호는 필요없고, 그래서 생성을 안하는 듯..?
4) 크롬 시크릿 모드로 테스트를 해보면 로그인이 되지 않는 것을 확인할 수 있다.
- 비밀번호가 인코딩 되지 않았기 때문에 로그인 실패함.
5) SecurityConfig 클래스 파일 수정
- SecurityConfig 클래스 파일에 제일 처음 작성했던 passwordEncoder() 메서드를 활용해서 비밀번호를 인코딩해주면 로그인이 성공한다.
6) SecurityConfig 클래스 파일 코드 추가 - 사용자 계정 추가
- 아직 권한(여기서는 USER, ADMIN)에 대해서 별도로 설정을 해놓지 않았기 때문에 roles()에 입력한 아규먼트와 상관없이 로그인이 가능하다.
- 권한이 2개인 유저도 만들 수 있다.
7) SecurityConfig 클래스 파일 코드 추가 - securityFilterChain() 메서드 작성
* 필터 체인을 생성하기 전에는 모든 페이지가 로그인을 해야 확인할 수 있도록 설정이 되어있었지만.
* 필터 체인을 직접 생성한 이후에는 기본값으로 로그인 전에도 모든 페이지를 확인할 수 있게 된다.
- auth.anyRequest().authenticated()를 람다표현식에 넣으면 localhost:8080으로 요청을 보내도 자동으로 localhost:8080/login으로 리다이렉트 된다.
- auth.anyRequest().hasRole("USER")를 람다표현식에 넣으면 권한이 USER가 아닌 사용자들은 애플리케이션에 접근할 수 없게 된다.
(1) requestMatchers() 메서드를 사용하는 경우에는 순서가 중요하다. anyRequest(), permitAll() 메서드가 먼저 호출되면 안된다.
(2) requestMatchers() 메서드 뒤에 hasRole() 메서드가 있을 때
- requestMatchers() 메서드에 아규먼트로 입력한 url로 요청이 오면
- hasRole() 메서드에 입력한 아규먼트와 동일한 권한이 부여된 사용자만 접근 가능
* 로그인이 안되어있으면 자동으로 로그인 창으로 리다이렉트 됨.
(3) anyRequest() : 그 외 다른 모든 페이지들
(4) permitAll() : 로그인 없이 접근 가능
(5) 만약에 다른 페이지도 필터를 설정하고 싶다면 requestMatchers() 메서드에 아규먼트를 추가하면 된다.
(6) 다른 권한을 필터링하고 싶다면 requestMatchers() 메서드와 hasRole() 메서드를 추가하면 된다.
※ 스프링 레거시 프로젝트에서는 application-context.xml에서 작성했던 것을 스프링 부트 프로젝트는 클래스 파일에 메서드로 작성한다고 생각하면 됨.
- Bean 애너테이션이 xml의 <bean> 태그라고 생각하면됨.
- 메서드가 리턴한 객체를 스프링 컨테이너에서 관리해주는 것이다.
※ 스프링 시큐리티 빈은 레거시에서는 필터와 컨트롤러에서 작성했던 것을 메서드로 사용할 수 있게 해준다.
4. Thymeleaf + Spring Security
* thymeleaf-extras-springsecurity6 의존성이 추가되어있고, html 파일에 xml 네임스페이스로 xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity6" 이 설정되어 있어야 작동한다.
1) templates.layout 폴더 하위의 fragments.html 파일 수정
2) xml 네임스페이스 추가
3) navbar <nav> 태그 안에 있는 <ul> 태그 안에 코드 추가
* sec:authentication="name" : 세션에 저장된 유저 정보를 가져온다.
* 참고 자료(https://www.thymeleaf.org/doc/articles/springsecurity.html)
4) 브라우저에 출력되는 화면
5. 나만의 로그인 페이지 만들기
1) SecurityConfig 클래스 파일 수정
2) fragments.html 파일 수정
3) src/main/java 하위의 web 패키지에 MemberController.java 클래스 파일 생성
4) templates 하위에 member 폴더 생성
5) member 폴더 하위에 signin.html 파일 생성
* 로그인이 실패했을 때(쿼리스트링에 error 쿼리 파라미터가 생김)만 경고 문구가 보임.
6. 회원가입 페이지 만들기
1) MemberController 클래스 파일에 코드 추가
2) templates.member 폴더 하위에 signup.html 파일 생성
※ 스프링 시큐리티 참고문서(https://spring.io/projects/spring-security)
※ 스프링 컨테이너가 객체들을 관리하고 있다는 것을 로그를 통해 확인해볼 수 있다.
※ 메서드 사용 시 주의사항
- 스프링 7.0 버전에서 삭제될 예정인 메서드들이 많이 있으니 주의해서 사용하자.
- 삭제될 예정인 메서드는 아이콘에 대각선으로 줄이 그어져 있다.
[기말 프로젝트] - 3월 11일 부터 시작할 예정..
- 주제 선정 : Spring Boot로 만들 수 있는 주제
- AWS 사용법 공부 : 교재, 인터넷 검색
* EC2: 웹서버, RDS: 데이터베이스(MySQL)
* 과금 되는 부분이 있다면 학원에 청구 가능.
-------------------------------------------------------------
JPA에서 아쉬운 부분은 동적인 쿼리(dynamic query)를 이용할 수 없다는 것..
Query DSL이라는 라이브러리를 추가하면 동적인 쿼리를 구현하는 것도 가능함.