Post

03 Filter 유저 정보 분기

03 Filter 유저 정보 분기

1. note

  • 과금정산플랫폼 노트(2025.11.19.)

2. 기존 로직

  • 로그인 성공하면 세션에 유저 데이터 저장.
  • JSP로 페이지를 생성 + JSP내 AJAX로 스프링에 데이터 요청함.
  • 외부에서 배치 실행용으로 RestAPI 컨트롤러가 있음.
  • 각기 Request는 별도 특징이 없음.

3. 요청 내용

  • 외부에서 접근하는 내용들의 로그 기록이 필요함.
  • 메뉴 등 외부에서 페이지로 직접 접근하는 것은 막기를 원함.
  • JSP는 내년 초 디컴하고 리액트 등으로 변경 예정으로 정말 최소한의 터치를 희망.

4. Memo

  • RestAPI와 일반 View용을 분리하려고 했으나, 스프링 XML으로 하는 필터는 특정 URL 예외처리가 없었음…
  • 기존 소스가 우리가 원하는 것만 로그를 남기고 나머지는 OK임을 확인. / 원하지 않는 것을 예측하는것은 어렵다.
  • 인터셉터는 DispatcherServlet 통과한 애들만, 핸들러 매퍼에서 매핑하지 못한 URL들은 인터셉터에 잡히지않음.

5. 최종 대안

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   if( session에 userInfo 유무){
    // 있는 경우에는 무조건 한번이상 로그인됨 (이는 사내 LDAP에서 검증된 사람)
    // 요청한 scrn_cd 확인(기존 VIEW에서 쓰던 패턴) - ajax(바디) / View요청 (URL) 
    
    // User가 권한 있는지 판단
    // ++ UserInfo정보의 ID 이용해서 접근 가능 scrn_cd 확인
    // ++ 지금은 쿼리파라미터로 들어오는 scrn_cd값
    // ++ 보유한 권한이면 진행함
    // ++ 권한이 없으면 메인으로 넘김
    
    // 기타 메뉴들 요청시에는 scrn_cd값이 없으니 메인으로 넘김
    // ++ 이미 LDAP 통과 유저라, 굳이 Login으로 넘겨도 의미 X + 넘겨도 세션에 데이터있어서 메인으로 넘어와짐 
    
     
   }else{
    // userInfo가 없는건 로그인을 한번도 성공하지 못한 상태
    // 로그인을 위한 최초 접근과 RestAPI요청 및 의도하지 않는 접근들은 여기에 걸리게 됨
    // ++ 한번 접근후에 화면 변경등으로 VIEW를 재요청하거나 비동기로 데이터 조회하는 것은 선행 IF에서 잡혀서 안찍힘.
    // ++ 접속자 상세한 활동 내역은 인터셉터에서 어떤 화면에서 어떤 작업을 하고 있는지만 캐치하면 됨.
    // 이 타이밍에서 기본적인 로그 기록 (★)
    
    // 유저 필터 시작
    // ++ RestAPI는 기존에 header에 Key값을 설정해서 일치여부 검증하므로 Header에 해당 Key가 있는지 확인
    // ++ 나머지 로그인을 위한 최초 접근 통과
    // ++ 의도하지 않은 접근은 Login.jsp로 반환
   }

6. 최종대안2(2025.11.28.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  if(CSS 파일 예외){
  
  }
  
  if(세션 내 userInfo 유무){ // 없는 경우 로그인 관련 페이지 진행
    // 접근 경로가 OTP 나 Login이면 기존 그대로 진행
    // 기타 html, 등등 발생할 수 있는 변수는 로그인.jsp로 리다이렉트
    
  }else{
    //세션에 user_info가 있어야하고,++
    // 직접 접근 -> url로 메뉴를 직접 들어가는 것
    // 웹 접근 -> 웹페이지에서 요청해서 들어가는 것
    if(referer 유무){ 
        // referer가 없으면 AP 페이지 직접 접근이므로
        // 로그인해서 세션은 있으나, 페이지가 아닌 직접 접근,
      
        if(파라미터유무){
          // uriparam없는 거는 기타 메뉴에 직접 접근으로
          // 메뉴 직접접근은 허용하지 않음. 따라서 main으로 포워딩
          
        }else{
          // uriparam잇는건 권한이 필요한 통계 화면 직접 접근으로 권한 여부 검증.
          // 권한이 있으면 허용하고, 아니면 메인으로 포워딩
        }
      
    }else{
      // referer 정보잇으면 내부 웹에서 접근한 것으로
      
      if(파라미터유무){
        // uriparam없는 거는 화면에서 메뉴에 접근으로 허용
          
      }else{
        // uriparam잇는건 권한이 필요한 화면 접근으로
        // 권한은 웹에서 사전에 결정했으므로 그냥 포워딩
           
      }
      
    }
  }
This post is licensed under CC BY 4.0 by the author.