ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Security를 이용한 로그인 세션 확인.
    졸업과제/BackEnd 2023. 3. 30. 14:15

    사용자가 로그인을 했는지 안 했는지를 서버 측에서 확인해야 한다.

    로그인을 하지 않았는데 게시물을 작성 기능을 실행하거나 댓글을 작성하는 기능을 실행하면

    서버에서는 로그인 이후 기능을 이용해달라는 알림 문을 전송해야 한다.

     

    Spring Security의  Authentication에서 user의 정보를 관리한다. 만약 Authentication에서 받아온

    유저의 정보가 없거나 유효한 유저가 아니면 로그인이 되지 않았다고 판단하고 알림을 웹 페이지에 띄울 예정이다.


    Controller

    @Controller
    public class PostController
    {
        @GetMapping(value = "/writeMonth")
        public String postWriteMouth(Model model)
        {
            Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            if(principal =="anonymousUser"){
                logger.info("[postWriteMouth] 사용자가 로그인 하지 않아 게시물 작성 불가");
                List<RecentlyPostDto> recentlyPost = postService.RecentlyPost();
                PostSearchDto postSearchDto = new PostSearchDto();
    
                model.addAttribute("msg","로그인 이후 게시물 작성이 가능합니다");
                model.addAttribute("recentlyPost",recentlyPost);
                model.addAttribute("dto",postSearchDto);
                model.addAttribute("category",AreaEnum.values());
    
                return "home";
            }else {
    
                logger.info("[postWriteMouth] GET 게시물 월세 작성 Controller 동작.");
                MonthlyPostRequestDto monthlyPostRequestDto = new MonthlyPostRequestDto();
                model.addAttribute("Dto",monthlyPostRequestDto);
                model.addAttribute("areaEnum",AreaEnum.values());
                return "writeMonth";
            }
        }
     }

    사용자가 게시물을 작성하려고 클릭하면 동작하는 Get매핑 관련 컨트롤러이다.

    우선 SecurityContextHolder에서 principal을 받아온다. principal은 인증된 유저의 정보를 들고 있는 객체라고 보면 된다.

    Spring Security는 principal의 정보가 유효하지 않거나  "anonymousUser"라는 값으로 할당한다.

    즉 알 수 없는 유저라는 뜻이다.

     

    만약 principal이 "anonymousUser"라는 값이면 로그인하지 않은 상태이기 때문에 이와 관련된 로직 동작이 필요하다.

    코드 예시에서 if문안에 전달하는 model들은 home화면 출력에 필요한 model들이기 때문에 중요하게 보지 않아도 되지만

    model에서 전달하는 것들 중 msg라는 키값으로 전달되는 메시지의 내용이 중요하다.

    사용자가 본인이 로그인하지 않았다는 것을 알게 하기 위해 js로 알림 팝업을 띄워 줄 건대 그때 사용할 글자라고 보면 된다.


    JavaScript

     

        <script src="https://code.jquery.com/jquery-3.6.0.js"></script>
            <script>
                $(document).ready(function() {
                let message = "[[${msg}]]";
                if (message != "") {
                    alert(message);
                 }else {}
                })
        </script>

    팝업창을 띄우고자 하는 html 파일에 추가해 준 js 코드이다.

    $(document). ready(fuction ( ) {} ) 메서드란 html 코드의 로드가 끝나면 동작하도록 선언한 것이다ㅣ.

    let message = "[[$ { msg } ]]; 는 controller에서 전달된 Model 객체의 값을 담아내도록 선언해 준 것이다.

    만약 message가 공백이라면 alert를 해주지 않고 공백이 아니라면 controller에서 msg의 값이 전달된 것이다.

     

    Controller에서 user가 anonymousUser라면 msg에 문자를 실어서 전달하도록 해놓았으므로

    msg는 공백이 되지 않게 된다. 공백이 아니므로 alert를 이용해 팝업 창을 띄워주도록 js코드를 작성하였다.

     

    js코드를 요약하면 이렇다. html이 로드가 완료되면 함수를 실행하는데 msg가 공백이라면 아무런 동작도 하지 않고

    공백이 아니라면 alert를 이용해 Controller에서 전달된 msg값을 출력해 준다.

     


    Test

    로그인 하지 않았다는 로그를 확인할 수 있다.

     


    현재 cookie에서 token값이 사라지지 않고 과거의 token값으로 Principal을 추출해 오면 anonymousUser라는 값이 출력되는 것 같다.

    만약 cookie에 token값이 아예 존재하지 않는 경우에는 어떤 값으로 Principal에 어떤 값이 들어올지 확인해 보아야겠다.

     

    Spring Security에서 제공하는 로그아웃 기능에 쿠키값, 토큰값 삭제 기능이 있다고 얼핏 본 것 같은데

    로그인을 한 상태라면 로그아웃 할 수 있도록 로그아웃 기능을 다음에 추가해서 구현해 보고 테스트해보아야겠다.

    댓글

Designed by Tistory.