728x90
반응형
중요한 데이터 (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;
}
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;
}
728x90
반응형