[스프링 부트 쇼핑몰 프로젝트 with JPA] 4장 정리

스프링 시큐리티는 스프링 기반 애플리케이션의 보안 솔루션을 제공하며, 회원 가입, 로그인/로그아웃 기능 구현 및 페이지 권한 설정에 사용될 수 있다. 스프링 시큐리티는 인증과 인가 과정을 관리하며, `pom.xml`에 의존성을 추가하여 사용할 수 있다. 회원은 이메일로 구분되며, 각 회원은 역할에 따라 페이지 접근 권한이 부여된다. 또한, 스프링 시큐리티는 CSRF 토큰을 사용하여 모든 POST 방식의 데이터 전송을 보호한다.
DriedPollack's avatar
Apr 02, 2024
[스프링 부트 쇼핑몰 프로젝트 with JPA] 4장 정리

🌼스프링 시큐리티 소개

💡핵심 키워드

  • 스프링 시큐리티는 스프링 기반의 애플리케이션을 위한 보안 솔루션(인증/인가 등)을 제공한다.
    • 인증이란 해당 리소스에 대해서 작업을 수행할 수 있는 주체인지 확인하는 것이다.
    • 인가는 인증 과정 이후에 일어난다. 접근하는 사용자가 해당 URL에 대해 인가된 회원인지를 검사하는 것이다.
 

🌼스프링 시큐리티 설정 추가하기

💡핵심 키워드

security dependency 추가하기

  • 스프링 시큐리티를 사용하기 위해서 pom.xmlspring-boot-starter-security 의존성을 추가 후 Reload Maven Projects를 클릭하여 의존성을 받아온다.
  • 스프링 시큐리티를 추가하였다면 모든 요청은 인증을 필요로 한다.
 

🌼회원 가입 기능 구현하기

💡핵심 키워드

  • 각각의 멤버는 일반 유저인지, 아니면 관리자인지 구분할 수 있는 역할이 있어야 한다.
  • 회원은 이메일을 통해 유일하게 구분해야 하기 때문에, 동일한 값이 데이터베이스에 들어올 수 없도록 @Column(unique = true) 를 통해 unique 속성을 지정한다.
  • @Enumerated(EnumType.STRING) 을 통해 자바의 enum 타입을 엔티티의 속성으로 지정할 수 있다.
    • Enum을 사용할 때 기본적으로 순서가 저자오디는데, enum의 순서가 바뀔 경우 문제가 발생할 수 있으므로 EnumType.STRING 옵션을 사용해서 String으로 저장한다.
  • JunitAssertions 클래스의 assertEquals 메소드를 사용해서 저장하려고 요청했던 값과 실제 저장된 데이터를 비교할 수 있다.
  • JunitAssertions 클래스의 assertThrows 메소드를 사용해서 예외 처리 테스트가 가능하다.
  • 스프링 시큐리티를 사용할 셩우 기본적으로 CSRF(Cross Site Request Forgery)를 방어하기 위해 모든 POST 방식의 데이터 전송에는 CSRF 토큰 값이 있어야 한다.
    • CSRF 토큰은 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰이다.
    • 사용자의 세션에 임의의 값을 저장하여 요청마다 그 값을 포함하여 전송하면 서버에서 세션에 저장된 값과 요청이 온 값이 일치하는지 확인하여 CSRF를 방어한다.
  • javax.validation 어노테이션 예시
    • 어노테이션
      설명
      @NotEmpty
      NULL 체크 및 문자열의 경우 길이 0인지 검사
      @NotBlank
      NULL 체크 및 문자열의 경우 길이 0 및 빈 문자열(” “) 검사
      @Length(min=, max=)
      최소, 최대 길이 검사
      @Email
      이메일 형식인지 검사
      @Max(숫자)
      지정한 값보다 작은지 검사
      @Min(숫자)
      지정한 값보다 큰지 검사
      @Null
      값이 NULL인지 검사
      @NotNull
      값이 NUll이 아닌지 검사
    • 정보를 검증하려는 객체의 앞에 @Valid 어노테이션을 선언하고, 파라미터로 bindingResult 객체를 추가해서 결과를 담은 뒤, bindingResult.hasErrors()를 호출하여 값을 검증할 수 있다.
 

🌼로그인/로그아웃 구현하기

💡핵심 키워드

  • Spring Security에서 인증은 AuthenticationManager를 통해 이루어지며 AuthenticationManagerBuilderAuthenticationManager를 생성한다.
  • 화면을 이용하지 않고 Spring Security를 테스트하려면 spring-security-test 의존성을 pom.xml에 추가한다.
  • MockMVC란, 개발한 웹 프로그램을 실제 서버에 배포하지 않고도 테스트를 위한 요청을 제공하는 수단이다. GET, POST, PATCH, DELETE 등의 요청을 만들어 보낼 수 있다.
    • MockMvc 테스트를 위해 @AutoConfigureMockMvc 어노테이션을 선언한다.
  • thymeleaf-extras-springsecurity 라이브러리를 통해 사용자의 Authority를 확인해서 뷰에 적용시킬 수 있다.
 

🌼페이지 권한 설정하기

💡핵심 키워드

  • ajax의 경우 http request headerXMLHttpRequest 라는 값이 세팅되어 요청이 오는데, 인증되지 않은 사용자가 ajax로 리소스를 요청할 경우 Unauthorized 에러를 발생시켜서 페이지 권한에 따라 뷰를 보여줄 수 있다.
  • permitAll()을 통해 모든 사용자가 인증 없이 해당 경로에 접근할 수 있도록 설정할 수 있다.
 

🏁결론

해당 내용을 정리하면서 스프링 시큐리티를 이용해 회원 가입 및 로그인/로그아웃 기능을 구현하는 방법, 스프링 시큐리티를 이용해 회원의 역할에 따라서 페이지별 접근 권한을 부여하는 방법을 이해할 수 있었다.
Share article

More articles

See more posts

👨🏻‍💻DriedPollack's Blog