-요약
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=false) String 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} 을 이용하였다. )


- 세션 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
'21년이전 > Project' 카테고리의 다른 글
header, footer etc 파일 분리 (0) | 2021.07.20 |
---|---|
SPRING - javax.mail 을 활용한 google smtp서버 이용 (0) | 2021.06.06 |
MySQL - Timezone 대처방안, + SQLYOG 저장 쿼리복구 (0) | 2021.05.28 |
Mybatis+MySQL - sql function호출 하기 (0) | 2021.05.28 |
SPRING+MYSQL+MYBATIS 연동처리 (0) | 2021.05.13 |