728x90

-요약

HTTP의 특징  2가지:

1. 비연결성은 HTTP통신 이후 연결을 끊는 특징이고,

2. 비상태성은 이전 HTTP 통신의 상태를 유지하지 않는다는 것

이를 해결하고자 쿠키와 세션을 이용함.

https://velog.io/@ground4ekd/auth-cookie-session 참고.

 

쿠키 : KEY,VALUE 인 STRING 형태로 ,  클라이언트에 저장됨.    보안 약함.
세션 : Object 형태로 서버에 저장됨.   쿠키보다 보안이 좋음

 

자세한 정보는 https://devuna.tistory.com/23 을 참고하였다.

 

 

-직접사용해보기

 

하단에 있는 샘플은 사용자가 로그인 페이지에서 ID,PASSWORD()를 입력후

Login-post url 를 호출하였을때의 controller 상황이다.

-1. 쿠키생성-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public String postLogin(~~~~,HttpServletResponse response) throws Exception {
        System.out.println("controller - Login-POST");
        if((Integer)service.selectMember(userinfoVO)==1) {
            
            //create a cookie for the user id
            Cookie theCookie = new Cookie("IcApp.userName", userinfoVO.getId());
            theCookie.setMaxAge(60*60*24 );
            
            //add the cookie to the response
            response.addCookie(theCookie);
            
            return "main";
        }
cs

2 : server ->  client  로 쿠키를 넣어주기 위하여 HttpServletResponse  객체를 생성하였다.

7 : ( KEY , VALUE ) 형태로 쿠키를 생성한다 .   (참고로 userinfoVO.getId()은 사용자가 로그인페이지 에서 입력했던 id가 저장되어있다)   

8 : 쿠키의 유효시간을 하루로 설정하였다.  단위는 1초이다.

11 ,13: 쿠키를 response 에 실어서 main 페이지를 호출하였다.

 

결과페이지에서 생성된 쿠키를 확인 할 수 있다.

 

하단에 있는 샘플은 사용자가 로그인페이지로  이동하는 요청을 서버에 보냈을 경우이다.

- 2. client -> server 쿠키전달, 및 활용 (1) 비추-  (비추의 이유 : spring 을 쓴다면 어노테이션으로 축약해서 쓰자..)  

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value="/Login",method = RequestMethod.GET)
    public String getLogin(HttpServletRequest request,Model model) {        
        Cookie[] cookies = request.getCookies();//모든 쿠키들을 얻는다.
        for(Cookie temp : cookies) {
            if("IcApp.userName".equals(temp.getName())) {  //쿠키의 key 얻어옴    
                String userId = temp.getValue(); //쿠키의 value를 얻어옴
                model.addAttribute("userid", userId);
            }
        }
        return "Login";
    }
cs

2 : client -> server 로 넘겨주는 데이터(쿠키포함)를 받기 위해 HttpServletRequest 객체를 생성하였다.

3 : 클라이언트로부터 넘어온 모든 쿠키들을 얻는다.

4~9 :  쿠키의 key가 "IcApp.userName" 인 쿠키를 뽑는다.

         그리고 해당 쿠키의 value를 다시 model객체에 실어 client에 보낸다. 

10 : Login 페이지를 호출.

 

 

로그인페이지에 들어오자마자 자동으로 입력된 아이디를 확인 할 수있다. (물론 front부분도 dom탐색 처리해줬음)

 

 

 

@CookieValue ?

@CookieValue 어노테이션을 이용한다면 , HttpServletRequest 객체를 이용하지 않아도 

client로 부터 server가 원하는 cookie만 받아올 수 있다.

 

ex) @CookieValue(value="count", defaultValue="1", required=true) 자료형 변수

value : 적어야함.

value 속성값으로 전달 받을 쿠키의 이름을 지정한다.

required : 안적어도됨. (default : true )

required 속성을 true로 지정 하였다면,

value라는 key를 가진 쿠키가 존재하지 않을 시에 SPRING MVC는 Exception을 발생시킨다.

반대의 경우엔 Exception을 발생시키지 않는다.

defaultValue : 안적어도됨.

defaultValue은 쿠키가 존재하지 않을 경우 변수의 기본 값인듯.. 써보지 않음.

변수 : 적어야함.

변수에는 선택된 쿠키의 value가 들어감.

 

하단의 샘플은 윗 반복문 샘플과 동일한 수행을 한다.  

윗 샘플과 같이 , 사용자가 로그인페이지로  이동하는 요청을 서버에 보냈을 경우이다.

- 2. client -> server 쿠키전달, 및 활용 (2) 추천-  

1
2
3
4
5
6
@RequestMapping(value="/Login",method = RequestMethod.GET)
    public String getLogin(@CookieValue(value="IcApp.userName",required=falseString userId ,Model model) {
        System.out.println("controller - Login-GET");
        model.addAttribute("userid", userId);
        return "Login";
    }
cs

2 : required 를 false로 지정해주었다. default인 true로 하게 된다면 ,, 

"IcApp.userName"이라는 key를 가지는 쿠키가 없을때 에러를 발생시킨다. 아마 500 에러 날듯.

 

 

로그인페이지에 들어갔을때 , 자동으로 id가 완성된것을 볼수 있다.

 


-세션직접사용해보기

 

하단의 샘플은 사용자가 로그인페이지에서 로그인 정보를 입력하고 로그인 버튼을 눌렀을 경우 main페이지로 보내주는 예제이다.

1
2
3
4
5
6
7
8
9
10
    @RequestMapping(value="/Login",method = RequestMethod.POST)
    public String postLogin(UserinfoVO userinfoVO,HttpServletRequest request,~) throws Exception {
        System.out.println("controller - Login-POST");
        //id pw 비교
        if((Integer)service.selectMember(userinfoVO)==1) {
        //id pw 가 일치 할경우 , 세션 등록
            HttpSession session=request.getSession();
            session.setAttribute("Session_userID", userinfoVO.getId()); 
        return "main";
    }
cs

-기초개념-

서버가 최초로 jsp 페이지에 접근할때 , 마땅한 설정이 없다면 톰켓이 JSESSIONID 쿠키를 자동으로 생성해서 client로 전달한다. 

JSESSIONID : 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키

 

2 :  client->server 로 JSESSIONID 쿠키를 가져오기 위해서   HttpServletRequest 객체를 선언하였다.

7 : 세션획득.    JSESSIONID 쿠키가없다면 새 사용자라는 것으로 인식하여 새로운 Session을 만들고 반환, 

    JSESSIONID 쿠키가 있으면 존재하는 Session을 반환함.

8 : 세션 key-value를 한번 설정해두면 프로젝트내 모든 파일에서 "Session_userID" 에 접근이 가능하다.

 

프로젝트내 모든 파일에서 "Session_userID" 에 접근이 가능하다는 소리는 무슨 원리냐면은 ...

SSR원리에 의해 모든 view파일을 서버에서 만들어주고 client로 보내준다.

즉 , 서버 메모리에서  뷰단내에 있는 세션 key에 value를 붙여넣는 원리이다. 

 

보조설명으로,
브라우저의 쿠키중 JSESSIONID 의  value는 특정사용자에 대한 값으로 ,  서버가 특정 유저를 추적하는데 이용한다.
클라이언트가 Session key인 "Session_userID"의 value를 이용하려 할때,
우리가 외관적으로 보기에 모든 클라이언트에 동일한 session key ("Session_userID") - value  를 가지는 것 처럼 보이지만 
실제로는 JSESSIONID를 통해 session들을 구분하고 , 구분된 세션에서  session key ("Session_userID")에 대한 값을 얻는것이다.
즉, 클라이언트마다 JSESSIONID가 다르므로 다른 Session value를 얻게된다.

 

추가로) JSESSION value와    request를 통해 얻게되는 Httpsession객체.getId() 값은 동일하다.

 

하단의 결과 이미지들로 , 우리는 다른 브라우저마다 다른 세션 value를 얻은 것을 확인 할 수 있고,

JSESSIONID도 각각 다른 것을 확인 할 수 있다.

( view 단에서는 단순히 Session : ${Session_userID}  을 이용하였다. ) 

chrome에서 teamproject/test url로 접속

 

Internet Explorer 에서 teamproject/test url로 접속

 

- 세션 value 얻기 -

메소드에서 HttpServletRequest 파라미터를 가지는 대신 HttpSession 파라미터를 넣고

HttpSession객체변수.getAttribute("key값");  을 통하여 컨트롤러에서 데이터를 얻어 올 수도 있다.

 

 

하단의 샘플은 사용자가 로그아웃 버튼을 클릭시 서버에서 세션을 삭제해준다.

-server 에서 세션 삭제 - 

1
2
3
4
5
6
    @RequestMapping(value="/Logout",method = RequestMethod.POST)
    public String logOut(HttpSession session) {
        System.out.println("controller - logOut");
            session.invalidate();
            return "main";
    }
cs

2 : HttpSession 객체를 통해 JSESSIONID 쿠키와 연관된 세션을 받아온다.

4 : JSESSIONID 의 value에 일치하는 세션을 삭제한다.

5 : main page로 이동한다. 로그아웃 된 것을 확인 할 수 있다.

 

하단의 결과를 보면 , 메인 페이지에서 기존의 JSESSIONID쿠키가 삭제되고

새로운 JSESSIONID가 생성된 것을 확인할 수 있다.

 

 

하단처럼 web.xml 파일이 있을 경우 직접 세션만료시간을 수정할수 있다.(분단위)

-web.xml(tomcat server)-

1
2
3
4
5
6
7
  <!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->
 
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
cs

 

web.xml 파일을 이용하고 있지 않거나 명령을 덮어 쓰고 싶을 경우 , 다음 명령어를 이용하여 제한을 줄 수 있다.

1
session.setMaxInactiveInterval(120);
cs

1 : 사용자가 웹사이트를 이용하고 있지 않은 경우 ,세션 만료시간 제한을 걸어준다.

    초 단위이며 , 인수가 음수일 경우 세션만료없음

 

 

-추가개념-

세션을 다룰때 ,  1.  HttpSession    2. HttpServletRequest 의 getsession  방법외에도

어노테이션을 이용하여 다음과 같이 다룰수 있다.

1
2
3
@Controller
@SessionAttributes("userinfoVO")   //실제내부에선 HttpSession 다룸
public class HomeController {
cs

  컨트롤러 클래스 윗부분에 @SessionAttributes 어노테이션을 지정한다.

자세한 사용법은 후에 필요할시에 찾아보자..

 

 

-연관없는 추가개념

servlet-context.xml와 root-context.xml의 차이 는 아랫 사이트에서 잘 정리가 되어있다.

https://thiago6.tistory.com/70

 

 

참고개념 : Selenium Express의 Session & cookie https://www.youtube.com/watch?v=cpFfzE9eGT0

+ Recent posts