inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

안녕하세요 인터셉터관련 질문드립니다.

318

베이스연주자

작성한 질문수 5

1


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요 강의 듣다가 인터셉터에 대해 궁금점이 생겨 질문드립니다.
원래 처음엔 파라미터를 조작해서 값을 넘기는 경우를 어떻게 방지할까 고민했었습니다
(member/1/delete) 이런식으로 다른사람이 저의 고유아이디를 파라미터로 넘겼을때 제 계정이 삭제될수도 있기에
로직을 짜서 이를 방지하고자 했습니다.
 
이런식으로 세션에있는 (로그인되어있는)회원의 아이디와 파라미터로 넘기는 아이디로 회원을 찾아서 둘을 비교하여
일치하지 않을시에 "본인만 삭제가능합니다" 라는 경고창을 띄우고 홈화면으로 이동시키고자 했습니다.
 
코드는 잘동작했는데요 문제는 홈화면으로 이동까지는 잘되는데 컨트롤러에 남아있는 나머지코드들이 그대로 실행되어
계정이 삭제가 되더군요 안그래도 매서드들마다 저런 검증로직을 매번 추가하는게 비효율적인거같아 어떻게 통합하는 방법이 없을까 고민하다가(스태틱 매서드로 뽑아서도 사용해봣는데 결국은 매번호출해야하기에) 인터셉터 강의들은게 생각나서 컨트롤러 호출전에
검증로직을 수행하고자 했습니다.
 
강의중간에 11분쯤 Object handler를 로그에 찍어보시면서 넘어온 컨트롤러에 있는것들을 꺼내서 사용할수있다고 하셔서
HandlerMethod hm = (HandlerMethod) handler;
여기서 모든 매서드들을 다 호출해서 살펴봣는데 방법을 모르겟어서 질문드려요. 저의 상황에서는 deleteMemberr매서드안의
loginMember, id, request, response가 되겟네요
저는 위에 검증하는 로직을 인터셉터에서 수행하고 싶어서 id와 loginMember를 인터셉터의 prehandle 메서드에서 Object handler로
얻고자 했었습니다.
 
질문을 좀 정리하자면..
<1>
파라미터로 위와같이 값을넘겨서 다른회원의 정보를 수정하거나 삭제하는걸 방지하고 싶습니다.
떄문에 로그인한 회원의 정보와 파라미터값(보통 아이디)으로 찾은 회원의 정보를 비교하여 불일치시 메세지를 띄우고 홈화면으로
이동시키려고 로직을 짯구요
로직은 정상작동하나 페이지를 홈으로 이동시켰음에도 해당 메서드의 나머지 코드들이 수행되기에(이 예제에선 삭제)
이 상황에선 어떻게 코드를 수정해야할지 궁금합니다.
 
<2>
만약에 <1>에서 제가 원하는 결과를 얻었다고 가정해도
매번 메서드마다 저 로직을 넣는게 좀 비효율적인거 같았고 떄문에 스태틱메서드를 따로 뽑아서 코드를 좀 간결하게 만들어보긴했으나
여전히 매번 스태틱검증매서드를 호출해야하기에 고민이 있었습니다
또한 <1>에서 처럼 경고창을 띄우고 페이지를 이동시켰음에도 컨트롤러의 나머지 코드들이 수행되어 삭제가 되기에
인터셉터를 사용해서 컨트롤러 호출전에 위의 검증로직을 돌리고 싶었습니다
그 과정에서 제가 작성한 저 검증로직을 돌리려면 저 deleteMemberr의 파라미터 정보를 알아야했고(id, loginMember)
강의를 다시 복습하다가 11분경에 말씀하신 handler에서 정보를 뽑을수있다는걸 보고 .을 찍으면 나오는 모든 매서드들을 실험해봣는데 원하는데로 파라미터 들을 뽑아내지못하였습니다. 어떻게 문제를 해결해야할지 궁금합니다.
 
<3>
제가 생각한 위의 두가지 방법이 잘못된 방법인건지
더 나은 방법이 있는지 알고싶습니다
<1>, <2>의 궁금증은 결국
파라미터로 위와같이 값을넘겨서 다른회원의 정보를 수정하거나 삭제하는걸 방지하고 싶습니다
이문제 떄문인데 어떻게 처리하는지 너무 궁금합니다. 열심히 구글링해보았는데 원하는 정보들을 얻지못했습니다..
긴글 읽어주셔서 감사합니다
 
 
 
 
 
 

MVC spring

답변 1

2

David

안녕하세요. 김윤호님, 공식 서포터즈 David입니다.

1.  flush 이후 return "home"으로 처리하면 될 것 같습니다.

2. request로부터 url 정보를 가져와 id를 추출하고, session을 가져와 loginMember를 찾아오면 될 것 같습니다.

그리고 어떤 강의에서의 11분쯤인지도 언급해주시면 좋을 것 같습니다.

3. 2번의 작업을 굳이 인터셉터까지 갈 것 없이 필터에서 작업해줘도 됩니다.

감사합니다.

0

베이스연주자

안녕하세요 답변 달아주셔서 감사합니다.

<1>

경고창을 띄우고 '/'이 주소로(home) 이동하는 방식으로는

컨트롤러단에서 제가 원하는 결과를 얻을수 없는건가요?

 

flush()이후에 return "home"; 하면 컨트롤러로 리턴되어서

home.html로 가게 되어 나머지 밑의 코드들이 실행되지않는건 이해했습니다.

(사실 사진여러장올리면 보기 힘드니까 한장에 담아서 질문드리려고 코드를 저렇게 작성했는데

실제로는 정적팩토리메서드를 만들어서요..

검증로직이후에 리턴값으로 home이나 다른 html이름을 문자열로 넘기는 방식말고는

무조건 메서드의 나머지 코드들이 다실행될수밖에 없는건가요

(중간에 다른페이지로 요청했음에도 불구하고)

 

 

<2>

[스프링 인터셉터 = 요청 로그]  강의11분경입니다

handler에서 필요한것들을 뽑아서 사용할수있다고 하셧습니다.

.찍어서 나오는 매서드들을 다 시도해보았는데 원하는 정보를 뽑아내는 방법을 알아내지못했습니다

 

일단 로그인체크인터셉터로 실험을 해봤구요 

request로부터 url 정보를 가져와 id를 추출하고, session을 가져와 loginMember를 찾아오면 될 것 같습니다. <=== 이부분의 부연설명을 듣고싶습니다.

사진과 같이 정보가 나오는데 어떻게 /member/25/edit에서 25만 추출할수있는지

세션을 가져오는 부분도 어떻게 loginMember를 찾아올수있는지 잘모르겠습니다.

 

<3>

필터관련부분도 따로 더 공부하고 시도해보겟습니다

 

 

0

David

1. 서버 입장에서는 여전히 메서드가 실행중이기 때문에 return하여 메서드의 실행을 종료해야 합니다.

2.  25만 추출하는 방법은 정규표현식을 한 번 찾아보세요. loginMember쪽은 제대로 하신 것 같은데 null인거 보면 로그인 하지 않은 사용자가 요청한 것 아니실까요??

0

베이스연주자

답변감사드려요

<1> 완전히 이해했습니다.

<2>  25만 추출하는 방법은 정규표현식을 한 번 찾아보세요.

->정규표현식도 공부하고 적용하여보겠습니다

loginMember쪽은 제대로 하신 것 같은데 null인거 보면 로그인 하지 않은 사용자가 요청한 것 아니실까요??

-->이부분은 제가 실수했네요 다시 해보니 loginMember정보얻을수있엇습니다.

 

사실 첨에 질문드린게 제일 궁금한 내용이라 다시 질문드려요

HandlerMethod hm = (HandlerMethod) handler;

[스프링 인터셉터 = 요청 로그]  강의11분경입니다

 

handler에서 필요한것들을 뽑아서 사용할수있다고 하셧습니다.

컨트롤러의 메서드에서 @PathVariable Long id를 넘기기떄문에

handler에서 메서드의 파라미터 정보를 얻을수있다면 id로 회원정보를 찾는게 

수월할거같아서요

인터셉터의 preHandle 메서드의 인자인 handler에서 

어떻게 컨트롤러의 메서드의 파라미터로 들어오는 정보들을 꺼내어 사용하는지 알고싶습니다

 

0

David

handlermethod는 메서드 시그니처에 대한 정보를 들고 있는 것이지 해당 파라미터로 들어오는 값을 들고 있진 않습니다.

request 자체에서 값을 뽑아내셔야 합니다.

0

베이스연주자

답변 감사드립니다~!

이미지 업로드와 db 트랜잭션 묶는법

0

72

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

95

2

MessageSourceTest 코드

0

68

1

인터셉터 에러 설정

0

71

1

resolveArgument()메서드 질문

0

72

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

82

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

162

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

125

3

pdf 오타 문의

0

66

1

ItemUpdateForm 검증 관련 질문입니다.

0

62

1

22page 링크 주소 변경

0

71

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

61

1

섹션3번 수업에 대한 질문입니다.

0

99

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

99

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

83

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

160

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

82

1

톰캣 에러 페이지가 안보입니다.

0

123

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

92

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

139

2

ApiExceptionController 질문드립니다.

0

72

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

69

1

MemberRepository 필드의 fianl 선언 유무

0

93

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

64

1