스프링부트 공부기록(30) - 스프링 시큐리티(Spring Security) 연동, 인증, 인가, 커스터마이징
my code archive
article thumbnail
반응형

🤍스프링 시큐리티 프로젝트 생성

 

1. application.properties에 시큐리티 설정 추가

logging.level.org.springframework.security.web=trace
logging.level.org.zerock=debug

 

2. 시큐리티 설정 클래스 SecurityConfig 작성

@Configuration
@Log4j2
public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

 

💡인증(Authentication) & 인가(Authorization)

  • 은행에 금고가 있고 사용자가 금고 내용을 열어 본다고 가정했을 때
  • 사용자가 신분증으로 자신을 증명 => 인증
  • 은행에서 사용자가 금고를 열어볼 수 있는지 판단 => 인가 (일종의 허가)

 

🤍스프링 시큐리티 커스터마이징

1. 스프링 부트 2.0부터는 인증을 위해 반드시 PasswordEncoder를 지정해야함.

  • BCryptPasswordEncoder는 'bscrypt'라는 해시 함수를 이용해서 패스워드를 암호화함.
  • 암호화된 패스워드는 다시 원래대로 복호화가 불가능하고 매번 암호화된 값도 다르게 됨.
  • @Bean을 이용해서 BCryptPasswordEncoder를 지정할 수 있음.
 @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

 

2. BcryptPasswordEncoder 테스트

  • 내부적으로 "1111"이라는 문자열을 암호화함.
  • 해당 문자열을 암호화한 결과가 "1111"에 맞는지 확인함(match)

  • 테스트 결과

 

3. Security Config 클래스에 인가(Authorization)가 필요한 리소스 설정 코드 추가

  • permitAll() : 모든 사용자에게 허락한다는 의미 -> 로그인하지 않아도 접근이 가능하게됨.
  • formLogin() : 인가/인증 절차에서 문제가 발생했을 때 로그인 페이지를 보여주도록 지정함.
  • logout() : 별도의 설정없이 로그아웃 처리 가능
 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/sample/all").permitAll()
                .antMatchers("/sample/member").hasRole("USER");
        http.formLogin();   //인가&인증에 문제 시 로그인 화면
        http.csrf().disable();  //csrf 토큰 비활성화
        http.logout();

 

🤍프로젝트 JPA 처리

회원 정보는 아래와 같이 구성 예정

  • 이메일(아이디 역할)
  • 패스워드
  • 이름(닉네임)
  • 소셜 가입 여부
  • 기타(등록일, 수정일)

1. 테이블 생성

2. 더미 데이터 넣기

 

🤍시큐리티 UserDetailsService

  • 스프링 시큐리티에서는 회원이나 계정에 대해 User라는 용어를 사용함.
  • 회원 아이디 대신 username이라는 단어를 사용함.
  • 사용자의 username, password로 인증 과정이 끝나면 원하는 URL에 접근할 수 있는 적절한 권한이 있는지 확인 후 인가 과정을 실행함.

1. ClubAuthMemberDTO 클래스 작성

  • DTO 역할 + 스프링 시큐리티 인증, 인가 작업
  • password는 부모 클래스를 사용하므로 별도 변수 선언 X

 

2. UserDetailsService 구현

  • AuthenticationManager는 내부적으로 UserDetailsService를 호출하여 사용자 정보를 가져옴.
  • JPA로 사용자 정보를 가져오고 싶다면 UserDetailsService가 이용하는 구조로 작성 필요
  • 사용자가 존재하지 않으면 UsernameNotFoundException으로 처리
  • ClubMember를 UserDetails 타입으로 처리하기 위해 ClubAuthMemberDTO 타입으로 반환

 

3. 사용자 정보를 화면으로 출력하기 위해 컨트롤러 코드 작성

 @GetMapping("/member")
    public void exMember(@AuthenticationPrincipal ClubAuthMemberDTO clubAuthMember){
        log.info("exMember.............");
        log.info("---------------------------");
        log.info(clubAuthMember);
    }

 

4. member.html 작성

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>For Member</h1>
<div sec:authorize="hasRole('USER')">Has USER ROLE</div>
<div sec:authorize="hasRole('MANAGER')">Has MANAGER ROLE</div>
<div sec:authorize="hasRole('ADMIN')">Has ADMIN ROLE</div>

<div sec:authorize="isAuthenticated()">
    Only Authenticated user can see this Text
</div>

Authenticated username :
<div sec:authentication="name"></div>
Authenticated user roles :
<div sec:authentication="principal.authorities">

</div>
</body>
</html>

 

5. 로그인 성공 시 회원 정보가 나오고

 

6. 실패 시 아래와 같이 나옴.

반응형
profile

my code archive

@얼레벌레 개발자👩‍💻

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

반응형