본문 바로가기
Develop Story

@AuthenticationPrincipal 사용시 주의점

by 박은유 2023. 5. 9.
반응형

 컨트롤러에서 유저정보를 컨트롤할 때 @AuthenticationPrincipal 어노테이션을 통해 유저정보를 파라미터로 받아 주로 사용한다. 아주 유용한 어노테이션이 아닐 수 없다. 인증된 사용자의 정보가 있다면 쉽게 유저정보를 받아서 사용할 수 있다. 따라서 개발을 할 때 자주 쓰는 어노테이션 중 하나인데, 그러다보면 아주 간단하지만 놓치면 치명적인 실수를 할 때가 있다. 바로 null 체크인데 예를 들어 어떤 게시판에서 해당 게시물을 등록한 유저인지 그 외의 유저인지 체크해서 수정버튼을 보여주거나 가린다고 가정해보자.

	@GetMapping("/test")
	public ModelAndView pageTest(@AuthenticationPrincipal DtoAccount user) {
		ModelAndView mav = new ModelAndView("/board/detail");
        
        DtoBoard board = boardService.getBoardDetail(); //게시물정보
        
        long userSeq = user.getSeq(); //현재유저 시퀀스
        long boardUserSeq = board.getUserSeq(); //게시물을 등록한 유저시퀀스
        boolean isYours = false;
        if(userUid==boardUserUid) {
        	isYours = true;
        }
        mav.addObject("isYours",isYours);
		return mav;
	}

 위처럼 간단한 컨트롤러가 있다고 해보자. 파라미터는 생략했지만, 게시물 정보를 불러와서 유저정보를 비교해 해당 결과를 ModelAndView에 추가해주는 컨트롤러이다. 언뜻보면 문제가 없어보이지만, 만약 이 사이트의 게시물이 로그인을 안해도 접근이 가능하다면 문제가 생긴다. 로그인을 안했을 경우에는 파라미터의 user가 null이 되는데 이럴경우 user.getSeq();또한 null이 된다. 만약 위처럼 바로 long 자료형에 대입을 하면 NullPointException의 에러가 뜨는것이다. 간단한 에러지만, 생각보다 놓치기 쉽다. 다른 대부분의 파라미터들은 직접 값을 세팅해서 넘겨주는경우가 대부분이라 체크를 잘 하지만, 위와같은 user는 자주 사용하다보면 익숙해지고 당연해지기때문에 간과하기가 오히려 더 쉽다. 서버에 띄우기 전 로컬에서 테스트할 때 대부분 체크가 가능하지만, 가끔 로컬에서도 로그인을 한 상태로만 테스트를 하면 오류가 뜨지 않기때문에 놓칠 수가 있다. 운영서버에 올리기 전 개발서버에서 찾아내면 다행인데 만약 운영에 올릴 때 까지 모른다면 ...

 위처럼 @AuthenticationPrincipal을 파라미터로 받아올 때는 꼭 주의해야한다. 유저정보가 강제되는 곳에서는 생길일이 드물지만, 유저정보 없이 진입이 가능한 페이지 혹은 페이지이동이 아닌 Post방식으로 데이터를 주고받을때도 사용할 일이 있다면 더더욱 신경쓰자.

	@GetMapping("/test")
	public ModelAndView pageTest(@AuthenticationPrincipal DtoAccount user) {
		ModelAndView mav = new ModelAndView("/board/detail");
        
        DtoBoard board = boardService.getBoardDetail(); //게시물정보
        
        long boardUserSeq = board.getUserSeq(); //게시물을 등록한 유저시퀀스
        long userSeq = 0;
        boolean isYours = false;
        if(user!=null) { // 유저정보가 있으면
            userSeq = user.getSeq(); //현재유저 시퀀스
            if(userUid==boardUserUid) {
                isYours = true;
            }
        }
        mav.addObject("isYours",isYours);
		return mav;
	}
반응형