IT수업/SPRINGBOOT

IT 수업 23주차 (176) SPRINGSECURITY

워제하 2024. 5. 27. 10:58

 

(2.x.x 버전때는 sts와 비슷하지만 3.x.x 버전으로 올라오면서 바뀌게 됐다. -  상속,의존관계를 두지 않고 bean을 사용하려  함)

 

start.spring.io로 들어가서 버전은 제일 낮은 3.2.6 으로 맞춰주고 SpringSecurity, SpringWeb, Lomgok, Tymeleaf를 받아 generate 해준다.

 

받은 파일의 압축을 풀어 원하는 파일에 넣은 뒤 cmd의 idea로 실행시켜준다.

 

setting에 들어가서 gradle을 입력해 build를 맞춰준다.

 

그리고 plugin에 들어가 lombok을 다운받아준다.

 

 

그리고 프로젝트의 setting을 들어가서 project버전과 SDKs의 버전을 21로 맞춰준다.

 

 

모두 설정한 뒤 AppApplication을 그냥 실행시키면 콘솔창에 security password가 나오게 되고 

 

 

 

주소창에 localhost:8080을 입력하여 들어가면 자동으로 login화면이 나오게 된다.

 

username에는 user를 입력하고 password 부분에는 콘솔창에 나온 security password를 넣어주면 된다.

 

그러면 주소창에 /?continue가 붙게 되는 것을 확인 할 수 있다.

 

 

 

인텔리제이로 돌아와서 config 패키지와 controller 패키지를 만든 후 SecurityConfig, HomeControlle, UserController를 만들어 준다.

HomeController
UserController

 

 

다음은 resources의 templates에 admin, index, member, user.html 파일을 만들어 준다.

index.html
user.html
member.html
admin.html

 

 

모두 만든 후 프로그램을 실행시켜 localhost:8080/user로 들어가면 localhost:8080/login 화면이 나오고 id 에 user 비밀번호에 콘솔창에 나온 security password를 입력하면 userpage로 넘어가게 된다.

로그아웃을 하려면 localhost:8080/logout을 입력하면 된다.

 

 

SecurityConfig.java로 와서 웹요청 처리를 위한 코드를 작성해준다.

3점대 버전으로 들어오면서 CSRF의 설정식이 람다식으로 바뀌게 되었다.

 

● Security Filter Chain

Spring Security 에서 제공하는 인증,인가를 위한 필터들의 모음으로 Spring Security 에서 가장 핵심이 되는 기능을 제공하며, 거의 대부분의 서비스는 Security Filter Chain 에서 실행된다.

 

Http 요청 -> Web Application Server(Servlet Container) -> 필터1 -> 필터2 ..... -> 필터 n -> Servlet -> 컨트롤러

 

CSRF는 Cross-Site Request Forgery의 약자로 사이트 간 요청 위조라는 뜻이다.
 CSRF는 웹 보안 취약점 중 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 조작한 요청을 신회할 수 있는 사이트에 대해 보내도록 만드는 공격이다.
이 공격은 사용자가 해당 사이트에 로그인한 상태에서 이루어지면, 사용자의 권한을 이용하여 악의적인 변경사항을 적용한다.

 

이러한 공격을 막아주는 CSRF를 비활성하는 이유는

rest api를 이용한 서버라면, session 기반 인증과는 다르게 stateless하기 때문에 서버에 인증정보를 보관하지 않는다.

rest api에서 client는 권한이 필요한 요청을 하기 위해서는 요청에 필요한 인증 정보를(OAuth2, jwt토큰 등)을 포함하여 인증하기 때문에 해당 토큰을 Cookie에 저장하지 않는다면 csrf 취약점에 대해서는 어느 정도 안전하다 할 수 있어 비활성화 시켜준다.

 

 

그리고 밑으로 와서 @Bean을 만들어 준다.

 

 

아직 localhost:8080/user로 하면 작동이 되지 않기 때문에 위로 올라가서 //로그인과 //로그아웃을 작성해준다.

 

 

그리고 login 페이지를 만들기 위해 resources의 templates 디렉토리 안에 login.html 파일을 만들어 준다.

 

UserController로 가서 login 페이지를 매핑시켜준다.

 

그리고 localhost:8080/user를 실행시켜보면 login 페이지가 나오는 것을 확인 할 수 있다.

 

 

● 인증 확인하는 방법 3가지

 

1.

UserController로 가서 user부분에 추가로 authentication과 model 을 추가해주는데 import는 각각 이렇게 해주면 된다.

import org.springframework.security.core.Authentication;
import org.springframework.ui.Model;

 

 

그리고 user.html로 가서 인증부분을 추가해주고 실행시켜본다.

 

localhost:8080/user로 실행시켜 로그인 하면 user page에 인증 정보가 나오게 된다.

 

 

 

2.

UserController에서 member도 추가로 작성해준다.

 

member.html에도 th를 추가해주고 실행시켜본다.

 

 

 

 

 

 

3.

이번에는 admin부분으로 가서 authentication을 작성해본다.

 

admin.html로 와서 표시할 authentication 항목들을 작성해주고 실행시켜본다.

 

이번에는 사용자 정보를 나타내도록 작성해본다.