강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

베이스연주자님의 프로필 이미지
베이스연주자

작성한 질문수

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

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

작성

·

307

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>의 궁금증은 결국
파라미터로 위와같이 값을넘겨서 다른회원의 정보를 수정하거나 삭제하는걸 방지하고 싶습니다
이문제 떄문인데 어떻게 처리하는지 너무 궁금합니다. 열심히 구글링해보았는데 원하는 정보들을 얻지못했습니다..
긴글 읽어주셔서 감사합니다
 
 
 
 
 
 

답변 1

2

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

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

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

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

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

감사합니다.

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

<1>

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

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

 

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

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

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

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

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

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

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

 

 

<2>

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

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

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

 

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

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

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

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

 

<3>

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

 

 

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

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

답변감사드려요

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

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

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

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

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

 

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

HandlerMethod hm = (HandlerMethod) handler;

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

 

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

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

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

수월할거같아서요

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

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

 

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

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

답변 감사드립니다~!

베이스연주자님의 프로필 이미지
베이스연주자

작성한 질문수

질문하기