Spring Security 란?
애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다.
[ 인증(Authorizatoin)과 인가(Authentication) ]
- 인증(Authentication): 해당 사용자가 본인이 맞는지를 확인하는 절차
- 인가(Authorization): 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
Security를 해보기 위해 먼저 프로젝트를 생성한다.
시큐리티는 처음부터 달면 페이지 이동할때마다 권한 검사를 하기 때문에 매우 힘들어진다.
따라서 나중에 추가해주자.
화면을 하나 띄웠다.
화면을 띄운 후에 아까 프로젝트 생성전에 하지 않았던 Security를 추가해줬다.
오른쪽이 우리꺼고, 왼쪽 코드가 시큐리티가 적용됐을때 변경되어야 할 코드이다.
빨간색 선은 자동으로 수정해준다.
초록색 선은 왼쪽코드가 오른쪽 코드에 추가만 해주는 거다. 이렇게 모든 선이 회색으로 되면 완성이다.
build.gradle
depedencies가 초기화되면서 바뀌는데, 나는 쿼리 로그 라이브러리 추가가 필요해서 다시 한번 가지고 왔다.
gradle 이후 서버를 다시 가동해주자.
이후 다시 해당 페이지를 띄워보았는데, 이게 안뜨고 아래 창이 뜨게된다.
url 주소도 login으로 바뀌면서 해당 페이지가 뜨게된다.
이때 pasworred는 서버를 런할때마다 새로 발급이 된다.
ID에 user
pw c72604c4-2cca-42c7-bc78-943e37d8a702
을 입력하고 나면,
html이 가동된다.
main.html , SecurityController 컨트롤러
페이지 이동하는 컨트롤러를 생성해주었다.
html도 만들어주고.
이렇게 한번 인증을 받게 되면, 더이상 인증해야 하는 페이지는 뜨지 않게 된다.
로그인 기존 방식
SecurityConfig
SecurityConfig 클래스를 하나 생성하고, 어노테이션을 두개 설정해주었다.
이렇게 해줘야지 얘가 security 설정파일이라는 것을 알 수 있다.
아직까지 따로 Implement를 해줄 필요가 없다.
SecurityConfig
security를 쓰기 위해선 반드시 예외처리를 해줘야해서 thorws Exception 을 붙여주었다.
SecurityConfig
인증 및 권한설정을 하기 위해 코드를 추가해주었는데, 회색으로 가로 취소줄이 뜨게 된다.
이거 옛날 버전이니까 딴거 써 하는 의미이다.
어떠한 요청에 대해 permitAll ( 모두 허용 ) 하는것이다.
return되는 애를 객채로 만들어주는 @Bean를 통해 리턴되는 데이터를 객체로 생성한다.
이 코드를 써주면, 모든 페이지에서 인증 기능을 해제한다.
새로 프로젝트를 run 할시에 이 화면이 안뜬다.
따라서 프로젝트를 실행시키면 인증 페이지가 안뜨고 바로 html 페이지로 오게 된다.
위 anyrequest (어떠한 요청) 대신해서 requestMatchers로 바꿔 권한을 허용해주었다.
그러면 /se/main으로 들어올 때만 정상적으로 작동하고 , 다른 경로로 들어가게 되면 엑세스가 거부됐다고 뜬다.
SecurityConfig
권한이 없으면 /se/login 으로 가게 해주었다.
DB, MemberVO, member-mapper
아이디와 비밀번호를 가지게 될 데이터가 필요하니까 생성해주자.
DB에 데이터를 만들어 테이블을 생성하고, VO 생성 및 mapper까지 만들어주었다.
login.html
member-mapper
mapper에서 login 쿼리를 만들어주고,
service
쿼리에 적용시킬 service 작업을 해준다.
SecurityController
이렇게 컨트롤러에서 데이터를 받고 login_result로 가야하는데,
html에서는 무반응이다. 콘솔창에도 아무 변화가 없다. 즉, 애초에 컨트롤러를 타질 못한다
SecurityConfig
loginProcess는 권한이 없기 때문에, 계속 맨 아래에 있는 loginpage("/se/login") 을 타게 된다.
오른쪽 그림과 같이 컨트롤러를 추가해주면 정상적으로 된다.
쿼리도 정상적으로 나오고, 로그인 성공 login_result.html이 뜨게 된다.
여기까지가 로그인 기존 방식이다.
시큐리티 로그인
UserDetailsServiceImpl 클래스
Spring Security에서 제공하는 인터페이스를 쓰려고 한다.
UserDetailsServiceImpl 클래스
여기보면 username만 필요하다. 즉, 아이디만 요구하는 것이다.
Service
UserDetailsServiceImpl 클래스
login 쿼리에는 MEM_ID, MEM_NAME, ROLE, MEM_PW를 들고온다.
단순히 입력한 아이디정보가 일치하는 회원 정보 조회이다.
UserDetailsServiceImpl 클래스
로그인을 하려고 하는 사람의 정보가 들어있는 정보다. 아직 로그인 한게 아니다.
.password("{noop}" + member.getMemPw()) 이 기능은 조회된 비밀번호가 암호화 처리 안되어 있음을 알림!
SecurityConfig
SecurityController 컨트롤러
login_success.html , login_fail.html
로그인 성공 화면과 로그인 실패 화면 각각 html을 생성해주었다.
login.html
시큐리티가 자동으로 로그인 해주기 때문에 login하는 코드를 쓸 필요가 전혀 없다.
그래서 로그인하는 트롤러를 만들어줄 필요 없다. 그러나 언제 로그인 할지 알려줘야하는데,
그 요청을 loginProcess로 해주었다.
시큐리티에서 기본적으로 id와 비번을 가져가려면 name 속성을 반드시 지켜줘야 한다.
아이디 name에는 반드시 username을, 비밀번호에는 password를 써줘야한다.
SecurityConfig
anyRequest() 위 경로 제외하고는 모두 인증을 받아야 하므로 로그인 폼으로 오게 된다.
로그인 성공 시 이동 경로는 우선순위가 제일 낮다.
원래 이동 url이 있다면 그쪽으로 이동한다. 무조건 기본 경로로 보내려면 두번째 매개변수로 true 주면 된다.
login.html
하지만, 내가 곧 죽어도 memId, memPw를 쓰고 싶다면,
SecurityConfig
이렇게 Parameter로 html에있는 name 값들과 맞춰주면된다.
페이지 이동은 인증이 되어있어야 se/main으로 간다. 그래서 login 페이지로 왔고,
여기서 시큐리티 로그인으로 로그인 해보면 인증을 받아서 page1로 왔다.
그럼 이제 세션에 login 정보가 저장되어 있을 것이다.
따라서 다시 se/main에서 페이지 이동을 누르면 다시한번 로그인 페이지로 가지 않고, 바로 page1로 가게 된다.
로그인 실패를 해보자.
시큐리티 로그인에서 로그인 실패를 했는데, 로그인 Fail 페이지가 안뜨고 똑같은 페이지에 머물러있다.
왜냐하면 인증을 받지 못했기 때문에 로그인 기본 페이지로 온 것이다.
SecurityConfig에서 로그인 실패했을 때도 인증을 주고, 다시한번 html에서 로그인을 일부로 실패해보았다.
콘솔창에 이렇게 입력한 아이디를 가진 회원이 없다고 뜬다.
이거는 UserDetailServiceImpl에서 실패했을때의 문구이다.
이렇게 로그인 실패 페이지로 이동하게 됐다.
DB에서 만들어준 데이터를 가지고 로그인을 해보았다.
로그인 후 page1.html에서 데이터들을 뽑아봤다. 데이터들을 위와 같이 뽑아줄 수 있다.
그러나, ROLE의 데이터가 이상하게 나온다.
roles에는 데이터베이스에서 받은 ceo ROLE 값 두개가 'ADMIN, MANAGER'로 들어와서
ROLE_ADMIN, MANAGER가 된다. 이는 roles("ADMIN , MANAGER")인 형태이다.
정상적으로 표출하기 위해선 roles("ADMIN" , "MANAGER")의 형태로 데이터가 들어와야한다.
따라서 split으로 문자열 , 를 짤라주면 된다.
따라서 이렇게 split을 추가해주었다.
'✨ Back-end > Spring-Boot' 카테고리의 다른 글
[Spring] 쇼핑몰 - 51 Security 사용해 로그인하기 (1) | 2023.04.24 |
---|---|
[Spring] 보드게시판 만들기(11) Security 사용해 로그인하기 (0) | 2023.04.21 |
[Spring] 쇼핑몰 - 50 마지막 에러 잡기 (0) | 2023.04.19 |
[Spring] 쇼핑몰 - 49 Chart.js에 Map 데이터 조회하기 (1) | 2023.04.18 |
[Spring] 쇼핑몰 - 48 select에 onchange 데이터 적용 Chart.js -2 (0) | 2023.04.17 |
댓글