최종 프로젝트 Security

선장원·2022년 2월 28일
1

최종프로젝트

목록 보기
9/9

최종 프로젝트

스프링 시큐리티를 써볼까 생각은 했었는데 취업상담 때 보안 얘기를 면접에서 많이 물어본다고 해서 추가 하였습니다.

많이 힘들었다

우리 뭐 먹을까요?는 회원과 업체의 로그인을 따로 받는다
하지만 시큐리티로 두 가지의 로그인 페이지를 받으려면 멀티 시큐리티를 사용하라고 하는데 이걸 도전했었는데 결국 선생님이 말하신대로 로그인 페이지를 통합시켰다 ㅠㅠ

Spring Security

스프링 시큐리티는 클라이언트가 웹에 요청(Request)을 보낼 때 바로 앞에서 검사를 하는 필터이다.

스프링 시큐리티에 종류는 엄청 많지만 나는 회원가입에 사용하는 암호화랑 시큐리티를 사용해서 로그인하고 토큰을 줘서 접근제한을 하는 것까지 했다.


설정
java11
Spring Boot
gradle
thymleaf


gradle

    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'

처음 의존성 주입은 시큐리티를 가져온다
이걸 추가하는 순간 실행을 하면 바로 인덱스로 안가고 로그인페이지로 가게 된다.

두번째는 타임리프와 스프링시큐리티를 같이 사용하게 해주는 의존성주입이다.
찾다보니 있어서 가져왔다
아마도 사용을 안하는 것같다

SecurityConfig

클래스 설정

@Configuration : 설정 파일을 빈(bean)으로 등록해준다
@EnableWebSecurity : 웹소켓이랑 비슷하게 시큐리티 설정을 사용하게 해준다
@ReqiredArgsConstuctor : final이 붙은 필드의 생성자를 생성해준다

WebSecurityConfigurerAdapret이라는 클래스를 상속(extends)받는다

정적파일을 시큐리티가 막는 것을 없애준다
다른 곳에서는 리스트로 다른 설정을 하던데 이게 편해보인다

http에 대한 시큐리티 설정

protected로 만든다

.authorizeRequests() : 접근제한 설정
.antMatchers() : 특정 경로를 지정한다 (*은 뒤의 모든 파일)
.hasRole("권한 이름") : 특정 권한만 접근 가능 설정
.permitAll() : 모든 사용자 접근 가능

.formLogin() : 로그인 설정 시작?
.loginPage("로그인 페이지 주소") : 로그인 페이지를 지정
.usernameParameter("파라미터 이름") : 아이디 또는 이메일 name값을 지정해준다
.passwordParameter("파라미터 이름") : 비밀번호 name값을 지정해준다
위 두개를 안쓰면 시큐리티가 지정한 name값을 사용해야한다
.loginProcessingUrl("로그인 액션 주소") : 로그인 메서드의 주소를 입력한다
.defaultSuccessUrl("로그인 성공 주소") : 로그인을 성공하면 어디로 갈 것인가

.logout() : 로그아웃 설정 시작?
.logoutRequestMatcher(new AntPathRequestMatcher("로그아웃 주소"))
.logoutSuccessUrl("로그아웃 성공") : 로그아웃을 성공하면 어디로 갈 것인가
.invalidateHttpSession(boolean값) : 로그아웃시에 세션도 지워줄까?

암호화에서 사용하는 BCryptPasswordEncoder클래스를 사용해 암호화를 한다
여기서 암호를 푸는 건가?


userDetailService를 지정하는 설정
로그인에서 어떤 서비스를 사용할 것인가 설정

이걸 두개로 하면 되지 않을까 해서 두개도 해봤는데 안됨ㅠㅠ

SecurityService

서비스를 먼저 만드는 것도 괜찮을 듯

클래스 설정

@Service : 서비스 빈 지정

UserDetailsService를 상속(implements)받는다

회원가입용
메서드 기존의 메서드를 가져와서
password부분만 암호화해서 저장한다.

로그인에 사용되는 메서드이다
같은 로그인 페이지를 사용하기 때문에 한개의 메서드안에서 구분해서 사용해야한다

회원은 이메일형식으로 받고 업체는 이메일형식이 아닌 형식으로 받으려고 생각중이다

회원 테이블을 조회 후 있으면 회원 로그인을 진행한다
회원의 아이디가 "admin"일 경우 관리자 권한 부여

회원 테이블을 조회 후 없으면 업체 로그인을 진행한다

리턴을 new User("이메일","비밀번호","권한");으로 해서 주면
시큐리티가 토큰을 넘겨준다.
이 토큰을 소중히 들고 다니면 될거같다.

나는 웹소켓을 사용하기 위해 HttpSession도 같이 저장을 했다.

여기는 비밀번호가 없는데 어떻게 비교를 해서 로그인을 할까
리턴 받은 비밀번호랑 입력한 비밀번호를 비교해서 결정하는 건가....?

Role

권한 부여용 enum클래스 세미프로젝트에서 사용해서 그나마 익숙하다.
Getter만 있고 Setter는 없다

html

<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

html에서 사용하기 위해서는 타임리프와 조금 다르게 설정을 해줘야 한다.

    <meta name="_csrf" th:content="${_csrf.token}">
    <meta name="_csrf_header" th:content="${_csrf.headerName}">

meta태그를 사용해서 토큰을 받아줘야 사용이 가능하다

토큰이 사용되거나 접근제한을 걸어둔 페이지에서 사용하면 된다

그리고 sec를 사용해서 토큰을 사용한다
여기서 사용하는 sec는 더 공부해야겠다

여기서 gradle의 두번째 의존성 주입을 사용하는 건가?

ajax

시큐리티 설정을 하면 ajax에서도 토큰을 같이 보내줘야지 ajax를 사용이 가능하다

우리의 소중한 토큰을 같이 사용해보자

함수 안에 var 타입으로 header와 token으로 만들어주고
값을 가져온다.

meta태그가 있어야 사용이 가능하다

ajax코드 안에 beforeSend : function()으로 토큰값을 먼저 보내준다.
아마도 ajax의 시작전에 토큰을 보내준다는 내용같다.


시큐리티를 설정만 하는데 일주일이 걸렸다
시큐리티를 먼저 설정하고 시작할 걸 그랬나...
이제 자소서도 첨삭 단계이니 다시 개발을 시작해야겠다!

profile
코딩도전기

0개의 댓글