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.