본문 바로가기
프로젝트/토이 프로젝트) 오늘도 휴일

보안을 위해 닉네임 대신 id 검증으로 코드를 리팩토링 하자!

by 휴일이 2023. 6. 22.

 

팬레터 게시물에 들어가면

글쓴이 본인일 경우 수정 / 삭제 버튼이 보이게 하기 위해

model 에 닉네임 값을 넣어 보내서

닉네임 값이 왔을 경우 수정/삭제 버튼을 보여주도록 했다

 

 

그런데,

닉네임은 변경 가능한 값이기 때문에

닉네임으로 검증할 경우

추후 다른 사람이 자기 게시물이 아닌데도 수정/삭제 버튼이 보이는 경우가 발생할 수 있다

 

그래서 닉네임 값이 아닌, id 값으로 본인 게시글 검증을 하도록 코드를 변경해보았다!

 

 

원래코드

    @GetMapping("/{num}")
    public String fanLetter(@PathVariable Long num, Model model, HttpServletRequest request) {
        // 글
        Map<String, Object> map = fanLetterService.readLetter(num);

        FanBoard fanBoard = (FanBoard) map.get("fanLetter");
        List<FileInfo> fileInfoList = (List<FileInfo>) map.get("fileInfoList");

        List<String> filePaths = webService.getFilePaths(fileInfoList);

        // 댓글
        List<Comment> commentList = fanLetterCommentService.readComment(num);
        List<CommentDto> comments = new ArrayList<>();

        for (Comment comment : commentList) {

            CommentDto commentDto = new CommentDto(comment);

            if (comment.getCommentRemover() != null) {
                commentDto.itRemoved();
            }
            comments.add(commentDto);
        }

        // 이전글 다음글
        Map<String, FanBoard> prevNextLetter = fanLetterService.prevNextLetter(num);

        FanBoard prevLetter = prevNextLetter.get("prev");
        FanBoard nextLetter = prevNextLetter.get("next");

        if (prevLetter != null) {
            model.addAttribute("prev", new PrevNextDto(prevLetter.getId(), prevLetter.getTitle()));
        }
        if (nextLetter != null) {
            model.addAttribute("next", new PrevNextDto(nextLetter.getId(), nextLetter.getTitle()));
        }


        model.addAttribute("fanLetter", new FanLetterViewDto(fanBoard, comments.size()*1L));
        model.addAttribute("filePath", filePaths);
        model.addAttribute("comments", comments);

        // 본인 글인지 확인
        try {
            String nickname = webService.getNicknameInSession(request);
            if (nickname.equals(fanBoard.getMember().getNickname())) {
                model.addAttribute("nickname", nickname);
            }
        } catch (MemberNotFoundException e) {
            System.out.println("로그인이 안 되어 있음");
        }

        return "/fanLetter/viewPage";
    }

이렇게 세션에 있는 닉네임 값을 가져와서 검증하는 것을 볼 수 있다

 

 

 

변경은 간단하다

 

        // 본인 글인지 확인
        try {
            Long memberId = webService.getIdInSession(request);
            if (memberId.equals(fanBoard.getMember().getId())) {
                model.addAttribute("writer", memberId);
            }
        } catch (MemberNotFoundException e) {
            log.info("로그인이 안 되어있음");
        }

 

이렇게 memberId 를 검증만 해주면 된다

model 에 넣은 값은 nickname이 아니니 writer 로 변경해준다

 

webService.getIdInSession() 은 MemberNotFoundException 이 발생할 수 있는데

로그인 사용자가 아니어도 글을 볼 수는 있기 때문에

예외가 발생해도 별다른 조치 없이 그냥 스무스하게 넘어가면 된다~

 

프론트에서도

writer 값이 null이면 안 보이도록

 

이렇게 리팩토링하니 닉네임을 사용할 때보다 보안에 더 유리하게 되었다 ^___^/

뿌듯!

728x90