spring에서 세션 대신에 특정값들을 저장해놓고 쓸수 있는 방법은 없을까요?

3,621 views
Skip to first unread message

Hwa Joon Lee

unread,
May 9, 2013, 10:54:06 PM5/9/13
to ks...@googlegroups.com
 안녕하세요. 날씨가 흐리네요....
 
다름이 아니라 스프링 초짜라 질문하나 드리려합니다.
 
꼭 스프링에 국한된 내용은 아니지만... 로그인 후에 그 사용자에 해당하는 정보를 세션이 아닌 다른 방법을 사용하여 저장해놓고
 
컨트롤단에서 호출시 꺼내어 쓸수 있는 방법은 없는가에 대해 그냥 혼자 생각을 시작하다가 혹시나 도움을 받을수 있을까 글을 남깁니다.
 
처음에는 인터셉터를 등록하여 정보를 가져온뒤 기존에 사용하던 컨트롤러에서 받을수 있게 하면 되지 않을까도 생각해서 시도했지만 잘 안되더군요.
 
컨트롤러에서 requestParam으로 받는 녀석에서 던져주려고 하니 결국 request.getAttribute로 꺼내야하게 되더군요...
 
 
요점은 한번 로그인하고 그 사용자가 사용할 몇가지 정보를 일일히 페이지에서 parameter로 던져주거나
 
매번 컨트롤러단에서 request.getSession 을 쓰지 않고 다르게 일괄적으로 컨트롤러 단으로 던져줄수 있는 방법이 있는가 입니다.
 
 
쓰잘떼기 없는 생각일지 모르겠지만... 한마디씩 남겨주시길 바랍니다.
 
환절기 다들 건강 잘챙기세요.

이수홍

unread,
May 9, 2013, 10:57:26 PM5/9/13
to ks...@googlegroups.com

스프링시큐리티에서는 쓰래드로칼이라는.방식으로 사용자 정보를 저장합니다.
물론 결국 쓰래드로컬도 세션에서 보관은 하지만 세션뿐만 아니라 다른저장소를 이용할 수있는게 장점입니다.

한번 쓰레드로칼threadlocal 이라고 검색해보시면 여러가지 정보가 나올겁니다. 주의점 잘 알아보시고 사용해보세요

2013. 5. 10. 오전 11:54에 "Hwa Joon Lee" <loveb...@gmail.com>님이 작성:
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/ksug?hl=ko-KR에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

Ki-Seok Kim

unread,
May 9, 2013, 11:53:35 PM5/9/13
to ks...@googlegroups.com
저는 스프링 시큐리티에서 로그인 성공시 핸들러에서 session scope bean 을 하나 생성해서 여기다 데이터를 저장해서 사용합니다.

그럼 필요할때
@Autowired 해서 데이터를 가져다 쓰는데요.. 단점은 junit test case 작성시 bean 을 생성해줘야하는 단점이 있습니다..

사용시에는 편리한데 유닛 테스트 작성할때 정말 고생했습니다.


2013년 5월 10일 오전 11:57, 이수홍 <sbc...@gmail.com>님의 말:

KwonNam Son

unread,
May 10, 2013, 12:02:31 AM5/10/13
to ks...@googlegroups.com
저장은 세션이나 Request에 해놓고(방법은 여러가지가 있겠죠? 보통은 Session Scope Bean이나 Request Scope Bean을 사용할 것입니다),
HandlerArgumentResolver(Spring 3.1 이상) 혹은 WebArgumentResolver(Spring 3.0 이하) 를 통해 객체로 넘겨주는게 가능합니다.

http://wiki.kwonnam.pe.kr/springframework/mvc/handlermethodargumentresolver



2013년 5월 10일 오후 12:53, Ki-Seok Kim <hello...@gmail.com>님의 말:



--
* 까먹지말자! http://kwon37xi.egloos.com

Hyunsok Oh

unread,
May 10, 2013, 12:20:13 AM5/10/13
to ks...@googlegroups.com
말씀하신 질문의 근본을 파고들어가 봅시다. 

1) 사용자 정보를 서버쪽에서 보관하고 싶다.
2) 사용자가 요청을 하면 해당 사용자가 누구인지를 판단해서 서버에서 1)에서 저장해둔 정보를 가져와 처리해야 한다.

1)이야 디비나 파일등을 쓰면 되니 큰 문제가 없겠죠. 문제는 2입니다.

결국 핵심은 HTTP요청이 들어오면, 개인을 식별해야 하는데 HTTP서버 입장에서 볼 때 이를 식별할 방법이 존재하냐? 입니다.

1) 클라이언트 IP를 사용한다면?  -> 공유(사설IP), 프락시 등등의 문제가 있을 수 있죠. 유일성 보장이 어렵습니다.
2) MAC등을 사용할 방법은 없나? -> 애석하게도 MAC는 너무 하위레벨입니다. 일반적인 웹 서버까지 정보가 올라오질 않죠. (잘 모르겠지만) 역시 프락시, 공유 등에 대처하긴 어려울 것 같습니다.
3) 사용자 로그인시(또는 최초 접속시) 무언가 식별자를 부여하고 이를 사용하자.
    => 이제 문제가 생깁니다. 식별자를 부여한다면 사용자가 다음 요청시 이를 서버에 보내줘야 합니다.
   방법은?
  
 3-1) 식별자를 요청할때마다 요청 파라미터로 넣어주자.  => 결국 URL에 https://mail.google.com/mail/ca/u/0/?shva=1#label/PROGRAMMING%2FKSUG/13e8c5c2a90f5e6c 이런식의 요상한 요청이 들어가게 됩니다. 
  이 방식에서는 이 식별자를 누가 어떻게 붙여주느냐 하는 것이 문제가 됩니다. 

 3-2) 식별자를 자동으로 클라이언트가 서버에 넘겨줄 다른 방법을 만들자. => 여기서 탄생한게 쿠키입니다. 클라이언트에 작은 크기의 정보를 남겨둘 수 있게 하고, 요청을 보낼때 쿠키값도 덧붙여 서버에 전송하면 서버에서는 이를 읽을 수 있습니다. 넷스케이프에 1994년 처음 도입되었고, 그 후 HTTP 표준으로 1997년 자리잡았습니다. 

 3-3) HTTP가 아닌 다른 연결방식을 사용하자 -> 우리의 논의 대상이 아니니 무시합니다.

사실은 쓰레드 로컬이건, 세션빈이건, 그 어떤 다른 기술이건 맨 밑바탕에는 3-1과 3-2가 자리잡고 있습니다. 쿠키 사용이 가능하면 쿠키를, 아니라면 요청에 토큰을 추가하는 방식으로 세션 ID를 클라이언트<->서버 사이에 공유하게 되고, 이게 없으면 모두 다 황입니다. 쿠키만 사용해도 위험한게, 쿠키를 보안상 막거나 하면 세션이 동작하지 않게 되어 버리니까, 둘을 함께 사용하는게 일반적입니다.

혹시 keep-live 상태라면 서버가 소켓 정보를 활용해 영속적으로 상태를 관리해 줄 수 있을 지도 모르겠지만, 이는 keep-alive를 지원하지 않는 브라우저에서는 적용 불가능하고, 로드밸런싱이나 프락시 등등이 들어가면 역시 생각해볼 여지가 많아지겠죠. 아마도 그래서 이런 방식으로 무언가를 관리 하는 웹 서버는 없을 것 같습니다.

말씀하신 질문의 요지가 request.getSession()이 없이도 데이터를 세션단위로 저장/가져오기 가능하냐는 말이라면, 세션스코프 빈을 사용하시거나 @SessionAttribute를 쓰는게 답이겠죠.  하지만, 만약 세션 기능을 사용하지 않고 상태를 유지하다가 사용자에게 보내줄 수 있느냐는게 질문이라면 없다..라는게 답인것 같습니다.

쉬운 문제에 사설이 긴것 같아 죄송합니다. 

Hwa Joon Lee

unread,
May 10, 2013, 12:52:12 AM5/10/13
to ks...@googlegroups.com
답변주신 모든분들 감사합니다. 언급하신 내용들 참고하여 다시 노력해보겠습니다.
 
바쁜시간 내서 답변 달아주셔서 감사합니다^^
 

애너벨리

unread,
May 13, 2013, 8:33:35 PM5/13/13
to ks...@googlegroups.com
 일단 , 질문자님께서 질문 하신 관점에서 보면 권남 님이 말씀하신 HandlerArgumentResolver(Spring 3.1 이상) 혹은 WebArgumentResolver(Spring 3.0 이하) 에 대한 답이 가장 적절해 보입니다..
 
 저도 짧은 지식으로 조언을 드리자면, RequestMappingHandlerAdaptor 확장 포인트에 SessionAttributeStore 라는 것이 있습니다.
 
@SessionAttribute 도 이 SessionAttributeStore 를 구현 한 DefaultSessionAttributeStore 를 사용합니다..
 
@SessionAttribute 를 사용 했을 경우, 아무리 setComplete()를 잘 해준다 해도, Session에 객체가 쌓일 수가 있습니다.(요청이 완료되기 전 다른 페이지 요청 등등의 상황으로 인해..)
 
어쨌든, 보다 효율적으로 세션 정보를 사용하기 위해(환경에 따라), 이 SessionAttributeStore 를 확장 하여, 세션영역이 아닌 다른 영역에 저장하도록 변경 하거나  보다 효율적으로  저장하도록 저장하는 방법을 바꿀 수도 있습니다..
 
참고하세요
 
 
Reply all
Reply to author
Forward
0 new messages