inblog logo
|
👨🏻‍💻DriedPollack's Blog
    🌼Spring

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

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

    🌼스프링 시큐리티 소개

    💡핵심 키워드

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

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

    💡핵심 키워드

    security dependency 추가하기

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

    🌼회원 가입 기능 구현하기

    💡핵심 키워드

    • 각각의 멤버는 일반 유저인지, 아니면 관리자인지 구분할 수 있는 역할이 있어야 한다.
    • 회원은 이메일을 통해 유일하게 구분해야 하기 때문에, 동일한 값이 데이터베이스에 들어올 수 없도록 @Column(unique = true) 를 통해 unique 속성을 지정한다.
    • @Enumerated(EnumType.STRING) 을 통해 자바의 enum 타입을 엔티티의 속성으로 지정할 수 있다.
      • Enum을 사용할 때 기본적으로 순서가 저자오디는데, enum의 순서가 바뀔 경우 문제가 발생할 수 있으므로 EnumType.STRING 옵션을 사용해서 String으로 저장한다.
    • Junit의 Assertions 클래스의 assertEquals 메소드를 사용해서 저장하려고 요청했던 값과 실제 저장된 데이터를 비교할 수 있다.
    • Junit의 Assertions 클래스의 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를 통해 이루어지며 AuthenticationManagerBuilder가 AuthenticationManager를 생성한다.
    • 화면을 이용하지 않고 Spring Security를 테스트하려면 spring-security-test 의존성을 pom.xml에 추가한다.
    • MockMVC란, 개발한 웹 프로그램을 실제 서버에 배포하지 않고도 테스트를 위한 요청을 제공하는 수단이다. GET, POST, PATCH, DELETE 등의 요청을 만들어 보낼 수 있다.
      • MockMvc 테스트를 위해 @AutoConfigureMockMvc 어노테이션을 선언한다.
    • thymeleaf-extras-springsecurity 라이브러리를 통해 사용자의 Authority를 확인해서 뷰에 적용시킬 수 있다.
     

    🌼페이지 권한 설정하기

    💡핵심 키워드

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

    🏁결론

    해당 내용을 정리하면서 스프링 시큐리티를 이용해 회원 가입 및 로그인/로그아웃 기능을 구현하는 방법, 스프링 시큐리티를 이용해 회원의 역할에 따라서 페이지별 접근 권한을 부여하는 방법을 이해할 수 있었다.
    Share article
    Contents
    🌼스프링 시큐리티 소개💡핵심 키워드🌼스프링 시큐리티 설정 추가하기💡핵심 키워드🌼회원 가입 기능 구현하기💡핵심 키워드🌼로그인/로그아웃 구현하기💡핵심 키워드🌼페이지 권한 설정하기💡핵심 키워드🏁결론

    👨🏻‍💻DriedPollack's Blog

    RSS·Powered by Inblog