2.스프링 시큐리티 [기존 컨트롤러와 불일치 해결하기]

dasd412·2022년 1월 31일
0

포트폴리오

목록 보기
21/41

리퀘스트 불일치 처리하기

문제 상황

기존 코드는 다음과 같다.
기존 컨트롤러 코드의 문제점은 작성자의 “기본키”를 URL이나 DTO에서 얻어내야 한다는 점이다.

@RestController
public class DiarySaveRestController {

    private final SaveDiaryService saveDiaryService;

    public DiarySaveRestController(SaveDiaryService saveDiaryService) {
        this.saveDiaryService = saveDiaryService;
    }


    @PostMapping("api/diary/diabetes-diary")
    public ApiResult<DiabetesDiaryResponseDTO> postDiary(@RequestBody DiabetesDiaryRequestDTO dto) {
        String date = dto.getYear() + "-" + dto.getMonth() + "-" + dto.getDay() + " " + dto.getHour() + ":" + dto.getMinute() + ":" + dto.getSecond();
        LocalDateTime writtenTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        logger.info("writtenTime : " + writtenTime);
        return ApiResult.OK(new DiabetesDiaryResponseDTO(saveDiaryService.saveDiaryOfWriterById(EntityId.of(Writer.class, dto.getWriterId()), dto.getFastingPlasmaGlucose(), dto.getRemark(), writtenTime)));
    }
}

DTO 코드를 뜯어보면 다음과 같다.

public class DiabetesDiaryRequestDTO {

    private final Long writerId;

    private final int fastingPlasmaGlucose;

    private final String remark;

    private final String year;

    private final String month;

    private final String day;

    private final String hour;

    private final String minute;

    private final String second;

    public DiabetesDiaryRequestDTO(Long writerId, int fastingPlasmaGlucose, String remark, String year, String month, String day, String hour, String minute, String second) {
        this.writerId = writerId;
        this.fastingPlasmaGlucose = fastingPlasmaGlucose;
        this.remark = remark;
        this.year = year;
        this.month = month;
        this.day = day;
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }
...
}

테스트코드에서도 알 수 있듯이, DTO의 작성자 id를 넣어준다.
하지만 스프링 시큐리티에선 세션 내에 이미 정보를 갖고 있다.
따라서 해당 정보를 넣어줄 필요가 없다.


문제점

input hidden 문제점

f12로 소스 보기하면 작성자의 기본키가 노출이 된다.

자바스크립트에서도 해결 안된다.

http only 쿠키인 jsessionid 는 자바스크립트에서도 가져올 수 없다.


해결방법

새로운 url 매핑할 수 있는 컨트롤러를 만든 후, Authentication을 얻어오는 로직이 추가로 필요하다.

예를 들어 기존 url api/diary/owner/{writerId}/diabetes-diary/{diaryId}/diet/{dietId} 이 있다고 한다면, api/diary/user/diabetes-diary/{diaryId}/diet/{dietId} 로 바꿔야 한다.

writerId는 굳이 dto로 받을 필요가 없다. 왜냐하면 시큐리티를 적용했기 때문에 세션 정보를 받아오면 되기 때문이다.

profile
아키텍쳐 설계와 테스트 코드에 관심이 많음.

0개의 댓글