-
46일차 - 자바 웹 개발(3)AI 솔루션 개발자과정(Java, Python) 2022. 12. 12. 15:52
쿠키와 세션
보통 웹 프로그램에서 사용되는 정보는 서블릿의 비즈니스 로직 처리 기능을 이용해 데이터베이스에서 가져온다. 그러나 동시 사용자 수가 많아지면 데이터베이스 연동 속도도 영향을 받게 되므로 정보의 종류에 따라 클라이언트 PC나 서버의 메모리에 저장해두고 사용하면 좀 더 프로그램을 빠르게 실행시킬 수 있다.
HTTP 프로토콜은 서버-클라이언트 통신 시 stateless 방식으로 통신을 한다.
즉, 브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결 정보도 새 웹 페이지에서는 알 수 없다.
따라서 웹 페이지나 서블릿끼리 상태나 정보를 공유하려면 웹 페이지 연결 기능, 즉 세션트래킹을 이용해야 한다.
웹 페이지를 연동하는 방법은 다음과 같다.
* <hidden> 태그 : HTML의 <hidden> 태그를 이용해 웹 페이지들 사이의 정보를 공유한다.
* URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여서 다른 페이지로 전송한다.
* 쿠키 : 클라이언트 PC Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유한다.
* 세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유한다.
쿠키란 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법이다.
쿠키의 특징은 다음과 같다.
1. 정보가 클라이언트 PC에 저장된다.
2. 저장 정보 용략에 제한이 있다(파일 용량은 4kb).
3. 보안이 취약하다.
4. 클라이언트 브라우저에서 사용 유무를 설정할 수 있다.
5. 도메인당 쿠키가 만들어진다(웹 사이트당 하나의 쿠키가 만들어진다).
쿠키는 클라이언트 PC에 정보를 저장해서 사용하므로 보안에 취약하다.
따라서 쿠키를 이용하는 방법은 주로 보안과 무관한 경우에 한해 사용된다.
예를 들어 웹 페이지를 방문했을 때 나타나는 팝업창의 '오늘은 더 이상 보지 않기'와 같은 기능이다.
쿠키는 다음과 같이 두 종류로 나눌 수 있다.
속성 Persistence 쿠키 Session 쿠키 생성 위치 파일로 생성 브라우저 메모리에 생성 종료 시기 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 브라우저를 종료한 경우 최조 접속 시 전송 여부 최초 접속 시 서버로 전송 최초 접속 시 서버로 전송되지 않음 용도 로그인 유무 또는 팝업창을 제한할 때 사이트 접속 시 Session 인증 정보를 유지할 때 Persistence 쿠키는 클라이언트에 파일로 정보를 저장하는 기능을 한다.
파일로 생성된 쿠키는 사용자가 만료 시간을 지정할 수 있는 반면에 Session 쿠키는 브라우저가 사용하는 메모리에 생성되는 쿠키이다.
브라우저가 종료되면 메모리의 Session 쿠키도 자동으로 소멸된다.
Session(세션) 역시 웹 페이지들 사이의 공유 정보를 서버에 저장해 두고 웹 페이지들을 매개해 주는 방법이다. 세션은 쿠키와 비슷한 역할을 하지만, 쿠키와 달리 세션은 서버의 메모리에 생성되어 정보를 저장한다.
따라서 웹 페이지에서 사용되는 정보 중에 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용한다.
세션은 각 브라우저당 한 개, 즉 사용자당 한 개가 생성된다.
세션의 특징은 다음과 같다.
1. 정보가 서버의 메모리에 저장된다.
2. 브라우저의 세션 연동은 세션 쿠키를 이용한다.
3. 쿠키보다 보안에 유리하다.
4. 서버에 부하를 줄 수 있다.
5. 브라우저(사용자)당 한 개의 세션(세션 id)이 생성된다.
6. 세션은 유효 시간을 가진다(기본 유효 시간은 30분이다).
7. 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용된다.
서블릿의 필터
서블릿 속성과 스코프
서블릿 속성이란 다음 세 가지 서블릿 API 클래스에 저장되는 객체(정보)라고 보면 된다.
* ServletContext
* HttpSession
* HttpServletRequest
서블릿 API의 setAttribute로 바인딩하고, 필요할 때 getAttribute로 바인딩된 속성을 가져오면 된다.
또한 removeAttribute를 이용해 속성을 서블릿 API에서 제거할 수 있다.
서블릿의 스코프는 서블릿 API에 바인딩된 속성에 대한 접근 범위를 의미한다.
ServletContext에 바인딩된 속성은 애플리케이션 전체에서 접근할 수 있으므로, 애플리케이션 스코프를 갖는다.
HttpSession에 바인딩된 속성은 그 HttpSession에 해당하는 브라우저에만 접근할 수 있으므로 세션 스코프를 갖는다.
HttpServletRequest는 해당 요청/응답에 대해서만 접근하므로 리퀘스트 스코프를 갖는다.
스코프의 기능은 다음과 같다.
* 로그인 상태 유지 기능
* 장바구니 기능
* MVC의 Model과 View의 데이터 전달 기능
서블릿의 여러 가지 URL 패턴
URL 패턴이란 실제 서블릿의 매핑 이름을 말한다.
즉, 서블릿 매핑 시 사용되는 가상의 이름으로, 클라이언트가 브라우저에 요청할 때 사용되며 반드시 /(슬레시)로 시작해야 한다.
서블릿 매핑 이름으로 사용되는 URL 패턴의 종류는 정확히 이름까지 일치하는지, 디렉터리까지만 일치하는지, 확장자만 일치하는지에 따라 세 가지로 나누어진다.
Filter API
필터란 브라우저에서 서블릿에 요청하거나 응답할 때 미리 요청이나 응답에 관련해 여러 가지 작업을 처리하는 기능이다.
프로그래밍을 하다가 한글 인코딩처럼 각 서블릿에서 반복적으로 처리해야 하는 작업이 있을 수 있는데, 이런 경우 서블릿의 공통 작업을 미리 필터에서 처리하면 반복해서 작업 할 필요가 없어진다.
필터는 용도에 따라 크게 요청 필터와 응답 필터로 나뉘며 다음과 같은 API가 있다.
* 요청 필터 - 사용자 인증 및 권한 검사 / 요청 시 요청 관련 로그 작업 / 인코딩 기능
* 응답 필터 - 응답 결과에 대한 암호화 작업 / 서비스 시간 측정
* 필터 관련 API - javax.servlet.Filter / javax.servlet.FilterChain / javax.servlet.FilterConfig
JSP의 정의와 구성 요소
초기 웹 프로그램은 서블릿을 이용해서 구현했다. 하지만 인터넷 사용자가 폭발적으로 증가하고 사용자에게 보여주는 화면의 기능이나 구성이 복잡해짐에 따라 사용자를 고려하는 화면 요구 사항도 점점 늘어났다.
그래서 현재는 프로그래머가 화면을 구현하지 않고 주로 디자이너가 이 일을 담당하는 추세이다.
기존 서블릿에서 화면을 구현할 때는 서블릿의 응답 기능으로 자바 코드를 이용해 HTML 태그를 브라우저로 전송하는 방식을 이용했다.
그런데 화면 구성이 복잡해짐에 따라 디자이너의 역할이 커지기 시작했는데, 디자이너는 개발자와 달리 자바 코드에는 익숙하지 않은 경우가 많아 화면 기능 구현 시 많은 불편함이 존재했다.
그래서 서블릿의 기능 중 별도로 화면 기능을 디자이너가 작업하기 쉽게 하기 위해 JSP가 등장했다.
JSP는 디자이너 입장에서 화면의 수월한 기능 구현과 개발 후 화면의 편리한 유지관리를 목적으로 도입되었다. 기존 서블릿에서는 자바 코드를 기반으로 문자열을 사용해 HTML과 자바스크립트로 화면을 구현했으나 JSP는 이와 반대로 HTML, CSS와 자바스크립트를 기반으로 JSP요소들을 사용해 화면을 구현한다.
JSP의 등장 배경을 정리하면 다음과 같다.
[문제점]
* 웹 프로그램의 화면 기능이 복잡해져 서블릿의 자바 기반으로 화면 기능 구현 시 어려움이 발생한다.
* 디자이너 입장에서 화면 구현 시 자바 코드로 인해 작업이 어렵다.
* 서블릿에 비즈니스 로직과 화면 기능이 같이 있다 보니 개발 후 유지관리가 어렵다.
[해결책]
* 서블릿의 비즈니스 로직과 결과를 보여주는 화면 기능을 분리한다.
* 비즈니스 로직과 화면을 분리함으로써 개발자는 비즈니스 로직 구현에 집중하고, 디자이너는 화면 기능 구현에 집중한다.
* 개발 후 재사용성과 유지관리가 훨씬 수월해진다.
JSP의 구성 요소는 다음과 같다.
* HTML 태그, CSS 그리고 자바스크립트 코드.
* JSP 기본 태그
* JSP 액션 태그
* 개발자가 직접 만들거나 프레임워크에서 제공하는 커스텀 태그
JSP의 3단계 작업 과정
JSP 파일은 다음과 같이 3단계를 거쳐 실행된다.
1. 변환단계 : 컨테이너는 JSP 파일을 자바 파일로 변환한다.
2. 컴파일 단계 : 컨테이너는 변환된 자바 파일을 클래스 파일로 컴파일한다.
3. 실행 단계 : 컨테이너는 class 파일을 실행하여 그 결과(HTML, CSS 등)를 브라우저로 출력한다.
JSP 페이지 구성 요소
JSP 페이지에서 사용되는 여러 가지 구성 요소들은 다음과 같다.
* 디렉티브 태그
* 스크립트 요소 : 주석문, 스크립트릿, 표현식, 선언식
* 표현 언어
* 내장 객체
* 액션 태그
* 커스텀 태그
이 중 디렉티브 태그와 스크리트 요소는 JSP가 처음 나왔을 때 많이 사용했던 기능이고,
그 외 요소들은 JSP에서 추가한 기능이다.
디렉티브 태그
디렉티브 태그는 주로 JSP 페이지에 대한 전반적인 설정 정보를 지정할 때 사용하는 태그이다.
디렉티브 태그의 종류는 다음과 같다.
* 페이지 디렉티브 태그 : JSP 페이지의 전반적인 정보를 설정할 때 사용한다.
* 인클루드 디렉티브 태그 : 공통으로 사용하는 JSP 페이지를 다른 JSP 페이지에 추가할 때 사용한다.
* 태그라이브 디렉티브 태그 : 개발자나 프레임워크에서 제공하는 태그를 사용할 때 사용한다.
페이지 디렉티브 태그 정의와 사용법
속성 기본값 설명 info 없음 페이지를 설명해 주는 문자열을 지정한다. language "java" JSP 페이지에서 사용할 언어를 지정한다. contentType "text/html" JSP 페이지에서 출력 형식을 지정한다. import 없음 JSP 페이지에서 다른 패키지의 클래스를 임포트할 때 지정한다. session "true" JSP 페이지에서 HttpSession 객체의 사용 여부를 지정한다. buffer "8kb" JSP 페이지 출력 시 사용할 버퍼 크기를 지정한다. autoFlush "true" JSP 페이지의 내용이 출력되기 전 버퍼가 다 채워질 경우 동작을 지정한다. errorPage "false" JSP 페이지 처리 도중 예외가 발생할 경우 예외 처리 담당 JSP 페이지를 지정한다. isErrorPage "false" 현재 JSP 페이지가 예외 처리 담당 JSP 페이지인지를 지정한다. pageEncoding "ISO-8859-1" JSP 페이지에서 사용하는 문자열 인코딩을 지정한다. isELIgnored "true" JSP 2.0 버전에서 추가된 기능으로 EL 사용 유무를 지정한다. 페이지 디렉티브 형식은 <%page %> 안에 속성과 값을 나열하면 된다.
페이지 디렉티브 태그는 import 속성을 제외한 다른 속성은 한 번만 선언해 주어야 한다.
JSP 스크립트 요소
JSP 스크립트 요소란 JSP 페이지에서 여러 가지 동적인 처리를 제공하는 기능으로, <% %>기호 안에 자바 코드로 구현한다.
<% %> 기호를 스크립트릿 이라고 부른다.
스크립트 요소의 종류는 다음과 같이 세 가지이다.
* 선언문 : JSP에서 변수나 메서드를 선언할 때 사용한다.
* 스크립트릿 : JSP에서 자바 코드를 작성할 때 사용한다.
* 표현식 : JSP에서 변수의 값을 출력할 때 사용한다.
선언문은 JSP 페이지에서 사용하는 멤버 변수나 멤버 메서드를 선언할 때 사용한다.
선언문 안의 멤버는 서블릿 변환 시 서블릿 클래스의 멤버로 변환된다.
선언문의 형식은 다음과 같다.

'AI 솔루션 개발자과정(Java, Python)' 카테고리의 다른 글
48일차 - 자바 웹 개발 (5) (0) 2022.12.14 47일차 - 자바 웹 개발 (4) (0) 2022.12.13 45일차 - 자바 웹 개발 (2) (2) 2022.12.09 44일차 - 자바 웹 개발 (0) 2022.12.08 43일차 - 도커와 웹 사이트 배포하기 (0) 2022.12.07