signal은 보통 electric signal 주로 사용
4bit 0101 -> binary number
아스키 코드 -> binary code (뭔가를 만들어 냄)
word는 정해진 bit가 없음. 즉, 고정된 값이 아님. 시스템의 VDD(공급 전원)에 따라 다름
8bit -> 1byte, 4bit -> nibble
General - (purpose) computer(=system) -> 일반 컴퓨터
Embedded - computer -> 특정 목적을 위한 컴퓨터(보통 1가지 목적만을 위함)
HDL(Hardware Discription Language)
진수 -> 계수만 따옴
10진수 = base 10 = radix 10
2진수 = base 2 = radix 2
연산은 두가지
산술 연산(사칙연산), 논리 연산(True,False)
산술 연산은 앞에 binary를 붙이고, 논리연산은 앞에 binary 잘 안붙임(보통 이진수이기 때문)
보수 - 뺄셈, 논리연산에 사용
radix complement(기수 보수), diminished radix complement(감소된 기수 보수)
complement of the complement -> original

연결은 물리적 연결 논리적 연결 두가지가 있다.

 

그 중 논리적 연결은 A ---- B 연결된 것 같다고 한다. (결과적으론 데이터가 가지만 직접 연결X)

 

데이터는 layer가 내려갈수록 헤더가 붙는다. (뒤에 붙인걸 트레일러)

 

같은 계층끼리 통신하고 양방향이다.

 

TCP/IP Protocol Suite

Application (message)

Transport (TCP -> Segment, UDP -> Datagram)

Network (Packet or Datagram)

Datalink (frame)

Physical (bit)

 

데이터를 주고 받을 때는 바로 데이터가 전송되는 것이 아니라 계층을 하나하나 내려가면서 헤더를 붙이고 스위치와 라우터를 통해 상대방에게 전달하고 받은 상대방은 헤더를 뜯어가며 최종적으로 애플리케이션층까지 전달된다.

 

Hierarchical - 신분적 계층 / layer - 그냥 층

같은 peer끼리는 논리적으로 연결되어있다고 본다.

 

물리 계층 - 실제 물리적으로 연결 예를 들면 무선통신, 광통신 등 특정한 정보를 전송할 수 있음

 

데이터 링크 계층 - 데이터링크 층에서 데이터 통신은 Node to Node 로 이루어진다. LAN을 통해 이동할 수 있고 이동하는 단위를 hop이라고 부른다.

데이터링크층에서는 Local <-> Local 통신하는데 보통 1km 내외이고, 장거리 통신 (WAN)의 경우 간선과 간선으로 이루어지고 30~40km 정도 된다.

데이터링크는 헤더만 본다. 데이터 처리시 앞부분만 보고 뒤는 그냥 냅둔다.

 

네트워크 계층 - source -> destiniation 경로를 찾는 과정이 중요 -> best route를 찾아야 함

여기서 best route란 비용이 우선이 될 수도 있고, 최단거리가 될 수도 있다.

host to host 통신이며, 전세계적으로 유일한 주소(IP)가 필요하다.

IPv4 = 2^32 = 40억개 -> 현재 부족

IPv6 = 2^128 = 10^40 -> 이제는 사물인터넷들도 많이 IP주소 부여 가능

IP는 Connectionless Protocol로 전송까지만 수행하고 그 외에 오류제어 흐름제어 혼잡제어를 하지 않음

IP는 간단하다. 간단한 만큼 기능이 부족하여 보조 프로토콜이 같이 동작한다 그 예로는 ICMP 등이 있다.

 

전송계층 - 하나의 애플리케이션 프로그램 -> 프로세스, 부르는 이름 -> port number(~65535)

ex)192.168.0.1:80 -> 소켓 주소

End to End 통신, TCP는 복잡하고 Connection-oriented protocl 즉 연결 지향 프로토콜이다.

이는 아까 논리적 연결과 같이 직접 연결되진 않았지만, 연결된듯한 효과를 누리도록 만들어준다.

UDP는 Connectionless이다.

 

응용계층 - Process to Process로 응용 프로그램끼리 통신한다.

HTTP, SMTP, FTP, TELNET/SSL, SNMP, DNS가 있음

 

캡슐화 / 역캡슐화, source, destination address, 패킷은 페이로드 내요이 바뀌게 허용X

허용 가능한 용량 MTU보다 크게되면 예외적으로 잘라내야 한다 이를 fragmentation(조각화)라고 한다.

조각조각 자른것들에도 헤더를 달아주고 다시 reassemble해준다.

IPv4의 자르는 주체는 Source가 될수도 있고 Router가 될수도 있지만,

IPv6의 자르는 주체는 Source만 가능하다.

 

Routing : IP 주소로 best route를 찾는 것

 

Forwarding : 포워딩은 표를 기반으로 데이터를 넘겨준다. 여기서 표는 주기적으로 갱신된다.

 

Error Control(오류제어) : checksum(더하기를 이용해 오류를 찾음) 에러가 생겼음에도 검출하지 못할 때가 있음

Flow Control(흐름제어) : 보내는 사람과 받는 사람 속도가 같지 않음. 보내는 측이 받는 측의 속도를 고려하여 속도를 조정한다.(IP는 지원하지 않는다)

Congestion control(혼잡제어) : IP는 혼잡한 패킷을 버린다. 하지만 ICMP 보조 프로토콜은 보낸 사람에게 버린걸 알려준다(현재 혼잡하니 보내지 말라고)

IP - unreliable but bes effort 버릴수 있지만(MTU 초과할 경우) 웬만하면 간다.(보장은 못함)

'이론 > 컴퓨터 네트워크' 카테고리의 다른 글

네트워크 층(5)  (0) 2023.03.27
네트워크 층(4)  (2) 2023.03.20
네트워크 층(3)  (0) 2023.03.20
네트워크 층(2)  (0) 2023.03.13

인터넷의 탄생

1969년 10월 29일 미국 국방부 산하 고등 연구국 ARPA의 연구용 네트워크 ARPANET을 통해 UCLA의 레너드 클라인록 교수가 스탠포드 대학교 연구소의 컴퓨터로 메시지를 전송하는데 성공한다.

 

레너드 클라인록은 Login이라는 아스키코드를 전송하려고 하였는데 Lo 까지는 잘 전송이 되었으나 나머지 문자를 보내는 중 장애가 나서 보내지지 않았다는 일화가 있다.

 

가까운 곳으로 보내는 것을 forwarding 이라고 하고 최적의 경로를 찾는 것을 routing 이라고 한다.

 

중간의 노드가 문제가 있어도 해결되는 것이 인터넷이다. (ex. A -> 1 -> 2 -> B, A가 B로 갈 때 중간에 1 혹은 2가 문제가 있어도 최적의 경로를 다시 찾아서 결국은 B에 도달한다)

 

ARPANET이 일반에 공개되어 TCP/IP 프로토콜로 연결되며 인터넷이 본격적으로 발전한다.

 

대한민국 인터넷 탄생

1982년 서울대학교와 KIET가 TCP/IP로 SDN을 시작했다. 이는 전세계에서 두번째이고 독자적으로 라우터를 구축하여 미국 망에 연결했다.

1988년 연구 전산망 기본 계획이 확정되어 교육망과 BITNET이 연결된다.

1994년 학술 및 교육 정보 교류용으로 제공한 하나망을 일반에 개방하여 코넷(KORNET)을 시작한다. 여기서 코넷은 다들 익숙히 아는 KT인터넷이다.

 

프로토콜은 컴퓨터 간에 정보를 원활하게 교환하기 위해 상호간의 약속 또는 규약이다.

 

프로토콜의 세가지 요소

  • 구문(syntax) : 데이터의 형식이나 신호, 부호화(encoding) 방법 정의
  • 의미(semantics) : 정확한 정보 전송을 위한 전송 제어와 오류 제어 방법 (ex. IPv4는 4비트로 앞 헤더가 0100(이진수)가 와야 하는데 아예 관련도 없는 1111(15)가 들어오면 버린다.)
  • 순서(timing) : 양단의 통신 속도나 순서 정의 (ex. Synchronous = 시간이 같다 = 동기식, Asynchronous = 비동기식)

 

TCP/IP 는 가장 많이 사용되는 프로토콜로 상세한 내용은 RFC라는 문서를 통해 공개된다.

RFC(Request for Comments)는 국제인터넷표준화기구(IETF)에서 만들었고, 인터넷에서 기술을 구현하는데 필요한 상세 절차와 기본 틀을 제공하는 기술 관련 문서이다.

 

국제인터넷주소관리기구(ICANN)

인터넷의 기술적인 문제 관리

인터넷의 유일한 식별자인 도메인 이름, 시스템(DNS)과 IP주소, 프로토콜 번호와 매개변수 배정 등을 관리

DNS 루트 네임 서버 시스템의 개선 및 운영 담당

 

인터넷할당번호관리기관(IANA)

인터넷이 생긴 초기에 사용자들에게 인터넷 주소를 할당하기 위해 국방정보청(DISA)가 만듦

현재는 인터넷소사이어티(ISOC)의 산하 기관

IANA의 가장 중요한 기능은 DNS Root Zone 을 관리

 

인터넷소사이어티(ISOC)

인터넷의 이용과 기술에 관한 국제적인 협조와 협력을 촉진하기 위해 1992년에 설립된 비영리 국제기구

세 개의 핵심 조직인 국제인터넷표준화기구(IETF), 인터넷기술관리그룹(IESG), 인터넷아키텍처위원회(IAB)를 지원

IETF : 인터넷을 운영, 관리, 개발에 대해 협의하고 프로토콜과 구조적인 사안을 분석하는 인터넷 표준화 기구

IESG : 인터넷의 기술적인 문제를 해결할 목적으로 설립된, 인터넷아키텍처위원회(IAB) 하부 조직

IAB : 인터넷소사이어티의 감독 단체로, 인터넷의 방침이나 장기적인 기획 및 기술 정책 등을 심의하고 결정

 

월드와이드웹컨소시엄(W3C) : 월드와이드웹, 웹 브라우저, 웹 서버 기술의 표준화를 추진하기 위해 교육연구 기관 및 관련 회사들이 모여서 만든 단체

 

국제전기통신연합(ITU) : 1865년에 설립되어 1947년부터는 UN산하 기관으로 활동, 정보통신 네트워크에 대한 기술적인 표준과 운영 표준을 발행

 

월드와이드웹(WWW) : 하이퍼텍스트 형식으로 표현된 다양한 정보를 효과적으로 이요할 수 있도록 구성한 전 세계적인 시스템

 

웹의 탄생

1989년 3월 13일 유럽입자물리연구소(CERN)에 근무하던 소프트웨어 공학자 팀 버너스리가 과학자들 사이에 쉽게 정보를 주고 받기 위한 목적으로 정보 관리 제안서를 발표

최초의 인터넷 기반 하이퍼텍스트 프로젝트

이후 1990년 하이퍼텍스트 브라우저와 편집기가 개발되고 URL, HTTP, HTML이 차례로 설계됨

1991년 8월 팀 버너스리는 월드와이드웹의 개념을 포함한 사이트를 일반인에게 최초로 공개하며 로열티를 포기

 

HTTP(HyperText Transfer Protocol)

인터넷에서 가장 많이 사용하는 프로토콜

문서간의 상호 연결을 통해 다양한 텍스트, 그래픽, 애니메이션을 화면에 보여주고 사운드를 재생

 

HTTP 1.0 : 1996년 5월에 완성되었으며, 메소드는 GET, HEAD, POST 방식만 지원

HTTP 1.1 : 2001년에 공식 발표되어 메소드는 OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT 방식 지원

HTTP 1.0과 1.1의 차이는 Connection: Keep-alive 속성 즉, 지속성이다. 이는 TCP 세션을 한번만 맺으면 1.0처럼 다시 세션을 맺을 필요가 없어지므로 비용을 줄이고 응답속도를 개선할 수 있게 된다.

 

'이론 > 해킹 및 바이러스' 카테고리의 다른 글

Email(1)  (0) 2023.04.03
FTP(3)  (0) 2023.04.03
FTP(2)  (0) 2023.03.20
FTP(1)  (0) 2023.03.14
인터넷과 웹의 개요(2)  (0) 2023.03.13

로그인에 대해 설명하기 앞서 도메인에 대해 잠깐 이야기해보겠다.

 

도메인은 시스템이 구현해야 하는 핵심 비즈니스 업무 영역으로 향후 웹 기술이 다른 기술로 바뀌어도 도메인은 그대로 유지되어야 하므로 웹이 도메인을 의존해도 되지만, 도메인은 웹에 의존해선 안된다.

 

로그인을 하면 로그인 상태를 유지해야하는데 HTTP는 비연결성이므로 이를 해결하기 위해 쿠키 라는 것을 사용한다.

 

쿠키에도 두가지 쿠키가 있다.

 

영속 쿠키 : 만료 날짜를 기입하여 해당 날짜까지만 유지하는 쿠키

세션 쿠키 : 만료 날짜를 생략하여 브라우저 종료시까지 유지

 

보통은 브라우저를 종료했을 때 로그아웃 되길 바라므로 세션 쿠키로 구현해보겠다.

 

Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);

로그인에 성공하면 쿠키(이름 : memberId, 값 : 회원의 id) 를 생성하고 response에 담는다.

 

@Controller
@RequiredArgsConstructor
public class HomeController {
 
 private final MemberRepository memberRepository;
 @GetMapping("/")
 public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId,
Model model) {
 if (memberId == null) {
 return "home";
 }

 Member loginMember = memberRepository.findById(memberId);
 if (loginMember == null) {
 return "home";
 }
 model.addAttribute("member", loginMember);
 return "loginHome";
 }
}

@CookieValue를 사용하여 쿠키를 조회할 수 있다. 여기서 required 옵션은 로그인을 하지 않은 사용자도 메인 홈에는 접근할 수 있어야하기 때문에 false로 주었다.

 

이렇게 되면 쿠키 값이 null이면 home으로 보내고, 쿠키 값이 있어도 회원이 없으면 home으로 보낸다.

 

쿠키도 있고 회원 정보도 있으면 통과한다.

 

쿠키를 이용하여 로그인 기능을 구현했는데, 로그아웃 기능은 어떻게 구현해야 할까?

간단하게 쿠키의 종료 날짜를 0으로 지정하면 된다.

 

@PostMapping("/logout")
public String logout(HttpServletResponse response) {
 Cookie cookie = new Cookie("memberId", null);
 cookie.setMaxAge(0);
 response.addCookie(cookie);

 return "redirect:/";
}

이렇게 쿠키의 setMaxAge 메서드를 이용하여 0으로 설정하면 쿠키가 즉시 만료된다.

 

이렇게 쿠키만 사용해서 구현하게 된다면 심각한 보안 문제가 발생한다.

 

그 이유는 쿠키 값은 임의로 변경이 가능하다. 임의로 변경이 가능하다는 것은 다른 사용자 행세를 할 수 있다는 말이 된다. 당장 개발자 도구를 키고 Cookie: memberId=1 값을 2로 변경하면 다른 사용자로 변경이 된다.

 

그리고 쿠키에 보관된 정보도 훔쳐갈 수 있으며, 도난당한 쿠키 정보를 통해 악의적인 요청을 계속해서 시도할 수 있다.

 

이러한 문제를 해결하기 위해 나온 방식이 세션 동작 방식이다.

 

세션 동작 방식을 사용하게 되면 로그인 순서는 다음과 같다

 

1. 먼저 POST로 ID 값과 비밀번호 값을 사용자가 전달하면 서버는 해당 사용자가 맞는지 확인한다.

 

2. 사용자가 맞다면 추정 불가능한 랜덤 값을 이용하여 세션 ID를 생성한다. 그리고 생성된 세션 ID와 세션에 보관할 값을 서버의 세션 저장소에 보관한다. -> sessionId: 랜덤한 값, value: 사용자

 

3. 서버는 클라이언트에게 쿠키 이름 : JSESSIONID, 값: 세션 ID  형태로 쿠키 저장소에 저장한다.

 

즉, 회원과 관련된 정보는 클라이언트가 일절 모른다는 것이다. 오로지 추정 불가능한(랜덤 값) 세션 ID만 쿠키의 값으로 전달한다.

 

이후 사용자가 클라이언트 요청시 JSESSIONID 쿠키를 전달하면 서버는 해당 쿠키의 값(세션ID)을 세션 저장소에서 조회하여 로그인시 보관한 세션 정보를 사용한다.

 

서블릿은 세션을 위해 HttpSession을 제공한다.

 

HttpSession session = request.getSession(); // 세션이 있으면 세션 반환, 없으면 세션 생성

session.setAttribute("loginMember", loginMember); // 세션에 로그인 정보 보관

로그인 로직이 성공하면 세션에 회원 정보를 담아준다.

 

여기서 request.getSession()에는 두가지 옵션이 있는데 기능은 다음과 같다.

 

request.getSession(true) : 세션이 있으면 기존 세션을 반환하고 없으면 새로 생성하여 반환

request.getSession(false) : 세션이 있으면 기존 세션을 반환하고 없으면 생성하지 않고 null을 반환

옵션을 주지 않으면 자동으로 true가 사용된다.

 

그리고 session.setAttribute()는 세션에 데이터를 저장한다.

 

로그인 로직을 보자

@GetMapping("/login")
public String LoginForm(HttpServletRequest request, Model model) {

 HttpSession session = request.getSession(false);
 if (session == null) {
 return "home";
 }
 Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);

 if (loginMember == null) {
 return "home";
 }

 model.addAttribute("member", loginMember);
 return "loginHome";
}

로그인을 살펴보면 세션정보가 없거나, 매핑되는 로그인 정보가 없다면 로그인 창으로 보내고 로그인에 성공하면 이후 로직이 출력된다.

 

로그인 정보는 session.getAttribute()로 불러오고 타입 캐스팅을 해주어서 검증한다.

 

HttpSession session = request.getSession(false);

if (session != null) {
 session.invalidate();
}

로그아웃 로직은 이와 같이 세션이 없다면 세션을 제거하는 로직으로 짜면 된다.

 

스프링에서는 이를 편리하게 사용할 수 있게 @SessionAttribute라는 어노테이션을 지원한다.

@GetMapping("/login")
public String LoginForm(
@SessionAttribute(name = "loginMember", required = false) Member loginMember,
Model model) {

 if (loginMember == null) {
 return "home";
 }

 model.addAttribute("member", loginMember);
 return "loginHome";
}

세션을 찾고 세션 정보를 통해 데이터를 얻는 과정을 편리하게 해결해준다.

 

이렇게 로그인을 처음 시도하게 되면

http://localhost:8080/;jsessionid=123456789ABCDEF

형태로 jsessionid 파라미터가 붙는다.

 

이것이 붙는 이유는 서버 입장에서는 웹 브라우저가 쿠키를 지원하는지를 모르고, 혹시라도 웹브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해 세션을 유지하기 위함이다.

 

URL 전달 방식을 이용하지 않고 쿠키를 통해서만 세션을 유지하려면(URL 뒤에 jsession 정보가 안붙게) 다음과 같이 입력한다.

 

application.properties

server.servlet.session.tracking-modes=cookie

 

세션의 타임아웃(세션 만료) 값 설정은 다음과 같다.

 

글로벌 설정 (분 단위로 설정해야 하고, 입력 값(1800) 은 초단위임)

server.servlet.session.timeout=1800

 

마지막 작업을 기준으로 세션 시간 설정

session.setMaxInactiveInterval(1800);

 

'Spring > SpringMVC' 카테고리의 다른 글

스프링 검증 - Bean Validation  (0) 2023.02.11
스프링 검증  (0) 2023.02.10
메시지, 국제화  (0) 2023.02.05
타임리프 - 스프링 통합과 폼  (0) 2023.02.05
타임리프 기본 기능 모음  (0) 2023.02.04

+ Recent posts