/*
// 중복 가능성 매우 작음 > sessionId 로 써도 됨.
?
thread에 관한 것을 처리할 때에는 try - catch 예외 처리 해야 함.
--------------------------------------------------------------
<%@page import="org.json.JSONObject"%>
<%@ page language="java" contentType="application/json; charset=utf-8"
pageEncoding="utf-8"%>
<%
/*
변수 영역
1. 전역 변수 : 누구나 해당 변수를 읽고 쓸 수 있다
장점 : 스코프가 넓다
단점 : 실수에 의해 값이 변경될 수 있다
2. 멤버 변수 :
3. 지역 변수 :
웹 변수 영역
1. application : 전역 변수
2. session : 클라이언트에 처음 연결되었을 때 발급해주는 값
3. request : 해당 요청시 사용되는 영역(forward시 값을 공유 할 수 있다)
4. page : jsp 페이지에서 사용되는 일종의 지역 변수
---------------------여기까지는 서버 memory base (객체상태의 heap데이터로 ram에 저장됨), 하나의 장비에서 동작
5. header : 클라이언트가 서버에 자료를 전달할 때
또는 서버가 응답을 처리하고 클라이언트에 결과를 줄 때
앞부분에 전달되는 자료를 header라고 부른다
6. cookie : session과 유사하며 브라우저에 저장된다
요청 시 header에 포함되어 서버에 전달된다
연결 지향 : 1:1 전화,, 다자간 통화는 다른 방법
비연결지향 : 웹 서비스에서는 서버와 클라이언트의 연결을 계속 유지시키면 과부하가 올 수 있기 때문에
연결을 유지하지 않는다
*/
int result = 0;
String message = "1~1000까지의 합계를 구함";
session.setAttribute("loop", true); // 세션을 이용해 loop 초기값 설정
System.out.println("합게 구할 때 sessionId = " + session.getId());
for(int i=1; i<=100; i++) {
if(!(boolean)session.getAttribute("loop")) {
message = "취소되었습니다";
break;
}
result += i;
try{
Thread.sleep(10);
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("sessionID : " + session.getId() + " i : " + i);
}
JSONObject jsonResult = new JSONObject();
jsonResult.put("status", (boolean)session.getAttribute("loop") ? 1: -1);
jsonResult.put("result", result);
jsonResult.put("message", message);
out.clear();
out.println(jsonResult.toString());
%>
---------------------------------------------------------------
상속 포함
포함은 어떤 클래스에서 다른 인스턴스를 사용하고 싶을 때 클래스의 멤버필드로 선언
상속 단점 : 원치 않은 자원도 다 받아야함.
포함은 멤버변수에 있는 특정 함수만 외부에 노출할 수 있음.
내부의 기능을 감추는게 핵심!
패턴의 종류로 proxy패턴이 있음.
프록시 객체 : 대리로 동작하는 객체 (A클래스 안에서 생성된 B클래스의 인스턴스 I. A클래스 내에서 B클래스의 함수 d(), e()에 접근하여 사용하기 위해 I를 생성하여 I.d();, I.e();형식으로 사용한다. 이때 I를 프록시 객체라고 함
프록시서버에 header정보를 다 보내줌
프록시 서버 => package.json에서 설정 : 설정후에는 서버 껐다가 다시 시작해야함.
{
"proxy": "http://localhost:8090"
}
프록시 설정 후
const response = await axios.get("http://localhost:8090/serverSum/sum.jsp");
위를 아래와 같이 수정
const response = await axios.get("/serverSum/sum.jsp");
--------------------------------------------------
// 아이디에 유일성을 부여
유일성을 보장할 수 있는 방법 :
System.currentTime(); 1000분의 1초
System.nanoTime(); 100만 분의 1초 // 중복 가능성 매우 작음 > sessionId 로 써도 됨.
UUID.randomUUID()
이더넷 카드는 랜카드다
물리적인 주소 48bit로 2^48가지 경우 가능 , 지역 + 국가 + 시간 으로 만듦
유일성이 보장되는 숫자라 한번만 발급가능하며 장비 고유번호로 씀.
String uuid = UUID.randomUUID().toString();
-----------------------------
application객체를 사용
application.removeAttribute 지워줘야함
왜 session대신 aplication객체를 쓰는가 ? > 해당 세션으로만 데이터가 저장되어서 통신이 되므로 제어가 불가능함.
데이터의 유일성을 보장하여 데이터 구분을 할수 있도록 하기 위함
그런데
apllication도 하나의 장비를 위한것임, 여러 개의 서버에서 공유 못함
서버가 여러개인 것과 상관 없이 쓰려면 DB에 저장한다
---------
proxy 서버를 쓰지 않았을 때 문제 :
--------
[CORS에러]
단독서버일 경우CORS에러를 고민할 필요가 X
- 단독서버 : WEB서버/프론트..jsp,,,html,,,
프론트 3000 (react ) ====> web서버 8090 (리소스,, 이미지,, js등 요청)
클라이언트 입장에서는 서버쪽을 호출 : 서버를 '클래스.메소드'로 생각할 수 있다.
프로그램이 실행되는것을 프로세스라고 한다.
메모리 를 code(함수에관한 영역)와 data(변수에 관한 영역)으로 구분한다. 정적변수,,지역변수,,,,힙 new
서버끼리 라이브러리 함수형태로 호출 가능, 실제로 인증서버, 캐싱서버, db서버, 게시판 서버 등 여러개 사용
-> 단일 책임의 원칙!
MSA micro service architecture
http 프로토콜은 보안 이슈로 msa 같은것이 불가능 => cors에러 뜸
http 주소 포트 URL
포트가 달라서 원본리소스의 공유가 불가능 =>> 이 규칙때문에 우ㅎ
-----
cors를 이용해서 다른 서버의 자원을 이용하겠다 라면 cookie는 못씀. header만 쓸수있다.
header는 응답 데이터다. html xml text json등으로 만들어서 보내주면 됨. (비동기통신에서)
그런데 이런 것들은 다 눈에 보이는 것들이다.
cors로 데이터 보내는 법 두가지
1. 헤더로 보내는 법
2. 응답데이터로 보내는 법
응답데이터는 보안에 취약ㅇ
중요한 데이터는 헤더에 담아 보내는 것이 좋다. web.xml의 param-value로 key 설정
*/
sum.jsp
contentType="application/json"
요청 확인
요청 데이터 : Headers Payload에서 확인
응답 raw data : Response에서 확인
Headers
헤더 안에는 Response Headers(응답 헤더)와 Request Header(요청 헤더)가 있음.
Header정보를 서버가 인식을 해서 거기에 알맞게 응답을 보냄.
쿠키와 브라우저 개념
Headers의 Accept
그 다음 요청 부터 Header에 쿠키가 생김
서버가 전에 요청한 것인지 새롭게 요청한 것인지를 구분할 때 이 세션 아이디로 함. 세션 아이디가 없으면 새 요청으로 여김
재요청 했을 때의 모습
아까와 다르게 RequestHeader에 쿠키값이 생김.
?
??
cors 에러 관련
filter
header에 필요한 key값 선언하여 사용 가능
header에서 sessionId라는 key로 쓸수 있음
출처(Origin)의 구성
예비 요청에서 확인 하는 부분
좋은 정보 얻어갑니다, 감사합니다.