Spring Boot

250305 Spring Boot 11 - 프로젝트에 의존성 추가, Spring Security 초기 설정, 블로그 만들기(6)

suerte10 2025. 3. 5. 18:19

1. 프로젝트에 의존성 추가하기

1) 프로젝트 우클릭 후 Spring - Add Starters 클릭

 

2) 기존에 사용했던 의존성들 모두 체크 + 새로 추가할 의존성 체크 ==> next 클릭

 

* OAuth2 Client : 소셜 로그인(구글, 카카오, 네이버 로그인 등) 구현에 필요한 라이브러리

 

3) 기존 내용에서 변경되는 내용을 확인하는 화면

  - 줄이 그어져 있는 부분을 클릭하면 [>] 표시가 나온다.

  - [>] 표시를 클릭하면 변경된 내용을 현재 파일에 반영할 수 있다.

  - 수정을 완료했으면 Finish 버튼을 클릭.

좌측: 기존 내용 대비 변경된 내용 / 우측: 기존 내용
변경된 내용이 현재 파일에 반영된 모습

 

4) 변경이 완료되고 프로젝트의 build.gradle 파일을 열어보면 의존성 설정이 업데이트 된 것을 확인할 수 있다.

프로젝트의 build.gradle 파일을 열어보면 업데이트 된 것을 확인할 수 있다.
의존성이 변경되면 프로젝트를 우클릭하고 Gradle -> Refresh Gradle Project를 해주는 것이 좋다.

 

 

 

2. Spring Security

1) Spring Security 의존성이 추가되면 프로젝트를 Spring Boot App으로 실행시킬 때 이클립스 콘솔에 security password가 출력된다.

password는 앱이 실행될 때 마다 변경되며, UserDetailsServiceAutoConfiguration에서 설정을 변경할 수 있다.

 

2) 그리고 아무런 설정을 하지 않아도 localhost로 접속을 해보면 로그인창이 표시된다.

스프링 시큐리티는 초기 설정에서 기본 계정 1개를 제공한다.(기본 계정 username : user)

 

 

 

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으로 리다이렉트 된다.

localhost:8080으로 요청을 보내면 자동으로 /login으로 리다이렉트 시킨다.

 

- auth.anyRequest().hasRole("USER")를 람다표현식에 넣으면 권한이 USER가 아닌 사용자들은 애플리케이션에 접근할 수 없게 된다.

권한이 USER가 아닌 사용자가 접근하면 403 에러가 발생한다.

 

 

  (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 네임스페이스 추가

url 경로는 build.gradle 파일을 참고해서 작성하였음

 

3) navbar <nav> 태그 안에 있는 <ul> 태그 안에 코드 추가

* sec:authentication="name" : 세션에 저장된 유저 정보를 가져온다.

* 참고 자료(https://www.thymeleaf.org/doc/articles/springsecurity.html)

 

4) 브라우저에 출력되는 화면

로그인 하기 전
user1 아이디로 로그인 한 이후
로그아웃을 클릭하면 자동으로 로그인 화면으로 리다이렉트 된다.

 

 

 

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)

 

※ 스프링 컨테이너가 객체들을 관리하고 있다는 것을 로그를 통해 확인해볼 수 있다.

애플리케이션을 실행시켰을 때 이클립스 콘솔에 출력되는 내용 중 일부. @Bean 애너테이션이 붙은 메서드들이 실행된 것을 볼 수 있다.

 


※ 메서드 사용 시 주의사항

첫번째 메서드는 스프링 7.0 버전에서 삭제될 메서드이기 때문에 사용하지 않는 것을 추천함.

- 스프링 7.0 버전에서 삭제될 예정인 메서드들이 많이 있으니 주의해서 사용하자.

- 삭제될 예정인 메서드는 아이콘에 대각선으로 줄이 그어져 있다.

 

 

[기말 프로젝트] - 3월 11일 부터 시작할 예정..

- 주제 선정 : Spring Boot로 만들 수 있는 주제

- AWS 사용법 공부 : 교재, 인터넷 검색

* EC2: 웹서버, RDS: 데이터베이스(MySQL)

* 과금 되는 부분이 있다면 학원에 청구 가능.

-------------------------------------------------------------

JPA에서 아쉬운 부분은 동적인 쿼리(dynamic query)를 이용할 수 없다는 것..

Query DSL이라는 라이브러리를 추가하면 동적인 쿼리를 구현하는 것도 가능함.