본문 바로가기
Programming/SpringBoot

[Spring Boot] RESTful Service 강의 정리 (4) - Response 데이터 제어를 위한 Filtering / 사용자 조회 예제

by prinha 2020. 8. 24.
반응형

 

 

[Spring Boot] RESTful Service 강의 정리 (3) - Response 데이터 형식 변환(XML format)

[Spring Boot] RESTful Service 강의 정리 (3) - 유효성체크(Validation API)와 다국어처리(LocaleResolver) [Spring Boot] RESTful Service 강의 정리(2) / User Service API 구현 [User Service API 구현] 1) Do..

prinha.tistory.com


 

중요한 데이터 (ex. 비밀번호, 주민번호)를 클라이언트에게 바로 노출시

-> 보안상의 문제가 있을 수 있음

 

 

1. 어노테이션을 활용한 Filtering

  1) @JsonIgnore 이용 -> 개별적으로 어노테이션 적용

// User

package com.example.restfulwebservice.user;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;

@Data
@AllArgsConstructor
public class User {
    private Integer id;

    @Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
    private String name;

    // 과거 데이터 제약 조건
    @Past
    private Date joinDate;

    // 중요한 데이터
    @JsonIgnore
    private String password;
    @JsonIgnore
    private String ssn;
}

 

 

 

  2) @JsonIgnoreProperties 이용 -> 클래스 블록에 어노테이션 적용

// User

package com.example.restfulwebservice.user;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;

@Data
@AllArgsConstructor
@JsonIgnoreProperties(value={"password","ssn"}) //클래스 블록에 추가
public class User {
    private Integer id;

    @Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
    private String name;

    // 과거 데이터 제약 조건
    @Past
    private Date joinDate;

    // 중요한 데이터
    private String password;
    private String ssn;
}

 

 

 

2. 개별 사용자 조회

  @JsonFilter() 이용하여 admin페이지에서 개별 사용자 조회

// User

package com.example.restfulwebservice.user;
import com.fasterxml.jackson.annotation.JsonFilter;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import java.util.Date;

@Data
@AllArgsConstructor
@JsonFilter("UserInfo") // Controller, Service 클래스에서 사용
// Filter ID를 문자열로 지정하며, 이 어노테이션 사용시에는 무조건
// FilterProvider와 해당 ID를 처리하는 필터를 제공해야함
public class User {
    private Integer id;

    @Size(min=2, message = "Name은 2글자 이상 입력해주세요.")
    private String name;

    // 과거 데이터 제약 조건
    @Past
    private Date joinDate;

    private String password;
    private String ssn;
}
// AdminUserController 생성 후 작성(UserController 복사)

// 개별 사용자 조회
@GetMapping("admin/users/{id}")
public MappingJacksonValue retrieveUser(@PathVariable  int id){
    User user = service.findOne(id);

    if(user==null){
        throw new UserNotFoundException(String.format("ID[%s] not found", id));
    }
    
    // SimpleBeanPropertyFilter : 지정된 필드들만 JSON 변환하고, 알 수 없는 필드는 무시
    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
            .filterOutAllExcept("id","name","joinDate","ssn");

    FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);

    MappingJacksonValue mapping = new MappingJacksonValue(user);
    mapping.setFilters(filters);

    return mapping;
}

 

JsonFilter(UserInfo) 때문에 사용자 페이지 오류

 

admin 페이지에서 작성한 filterOutAllExcept("id","name","joinDate","ssn"); 데이터만 조회 가능

 

 

 

3. 전체 사용자 조회

  @JsonFilter() 이용하여 admin페이지에서 전체 사용자 조회(=개별 사용자 조회와 별 다를바 없음)

// AdminUserController

// 전체 사용자 조회
@GetMapping("admin/users")
public MappingJacksonValue retrieveAllUsers(){

    List<User> users = service.findAll();

    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
            .filterOutAllExcept("id","name","password","ssn");
            
    // SimpleBeanPropertyFilter : 지정된 필드들만 JSON 변환하고, 알 수 없는 필드는 무시
    FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo",filter);

    MappingJacksonValue mapping = new MappingJacksonValue(users);
    mapping.setFilters(filters);

    return mapping;
}

 

 

 

 

반응형