이클립스 사용을하다 창이 꼬여 내 맘대로 안될때 초기화를 시켜버리자

 

1. 이클립스 창 배치 초기화 하기

Window > Perspective > ResetPerspective




 

'개념' 카테고리의 다른 글

[Eclipse] 이클립스 창 배치 초기화  (0) 2019.10.10
[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26

톰캣 가상호스트 테스트를 하려고 hosts 파일을 수정하려다가 자꾸 권한문제로 수정이 안되어서 검색으로 알아보았다.



위와 같이 저장이 안되버린다.


검색해서 알아본 내용중에 가장 쉬운내용을 정리해보면


1. 메모장을 '관리자 권한으로' 실행


2. 열려진 메모장에서 파일 -> 열기 -> hosts파일 선택


3. 수정 후 저장 끝


참고

https://blog.gaerae.com/2016/07/windows10-hosts-file.html

'개념' 카테고리의 다른 글

[Eclipse] 이클립스 창 배치 초기화  (0) 2019.10.10
[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26

Jsp Php Asp.net 모두 웹 서버 언어이다. 

웹 개발자로써 어떤 언어를 공부하고 사용할 것인지는 중요해 보인다. 그래서 각각의 특징을 알아보았다.



JSP


자바기반 언어이다 

방대한 자바 api 사용가능

자바의 우수한 이식성을 물려받아 윈도우 리눅스등 다양한 플랫폼에서 구동 가능하다

우수한 보안성을 가지고 있다.

우리나라에서 많이 쓰인다.

유지보수가 용이하다


단점

배우기 어렵다

개발이 오래 걸린다

상대적으로 무겁다



php


c언어 기반이다

역사가 길고 오픈소스여서 다양한 정보가 널려있다.

가볍다

리눅스 윈도우에서 다 가능하다.

유연한 언어


단점

서버 과부하시 상대적으로 불안정

상대적으로 보안성이 낮음



asp


vb기반

배우기 쉽다.

개발하기 쉽다.



단점

윈도우플랫폼에 한정된다






라고 흔히들 나와있다. 


그래서 소/중규모에는 php 중/대규모에는 jsp를 많이 쓴다고 한다.


하지만


 php도 보안에 취약하지 않다. 개발하기 나름이다 jsp는 오히려 느리고 불편하다 등등 말이 엄청 많다.


 나는 아직 어떠한 언어도 제대로 공부해본적이 없고 써본적도 없으니 와닿는 느낌이 없다. 그냥 그저 어떠한 언어든 익숙해지고 잘 쓰면 되는구나 라고 생각이 든다. 물론 어느정도 정점에 다다르면 언어탓을 할 수 도 있겠지만..


 그래서 결국어떤 언어를 사용하든 언어는 도구일 뿐이고 더 중요한 것은 개발자의 역량 이라는 결론이 주류인 듯 하다..

 어떤 언어가 낫다 라고 주류가 있는게 아니라 각자가 잘 쓰고 있는 언어를 좋다고 말하는 것 같다..

 그러므로 어떤 회사를 목표로 그 회사가 주로 사용하는 웹언어를 목표로 먼저 공부하는 것이 낫겠다.




'개념' 카테고리의 다른 글

[Eclipse] 이클립스 창 배치 초기화  (0) 2019.10.10
[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26
  1. 호이짜 2018.07.29 00:18

    표형태로 정리하는게 더좋을듯 한데 너무 나열하는 느낌이 강합니다.

역시나 기초지식이 전무하기에 간단하게 상위 개념부터 알아보겠다.


 우리는 웹 브라우저에 https://www.tistory.com/skin 과같은 URL을 치면 티스토리 웹 페이지가 화면에 딱 나온다.

 어떤 과정을 거쳐 나오게 되는 걸까?


 간단한 용어 정리


클라이언트 : 네트워크에서 요청하는 쪽 ex) URL을 요청하는 웹 브라우저 또는 그런 브라우저를 돌리는 컴퓨터

서버 : 요청을 받아 알맞은 기능이나 데이터를 제공하는 쪽 ex) 요청을 받아 응답을 하는 웹 서버 또는 서버 프로그램이 실행되는 컴퓨터





 웹 브라우저에 URL을 입력하면 웹 서버라 불리는 프로그램이 웹 브라우저에 웹 페이지를 제공한다. 하지만 웹 브라우저와 웹 서버는 각각 다른 컴퓨터에 위치한다. 예를 들어, 집 PC에서 웹 브라우저에 URL을 요청하면 그 URL을 받을 웹 서버는 다른 컴퓨터에서 실행 되고 있다. 그래서 웹 브라우저가 웹 서버에 연결하려면, 웹 서버가 실행중인 컴퓨터의 IP주소를 알아야 한다.


 IP 주소는 숫자로 구성되어 있고 ex)180.70.134.239 그래서 외우기가 힘들다. 이런 이유로 tistory.com 와 같이 도메인 이름을 사용한다. 하지만 연결하기 위해서는 IP주소가 필요하므로 DNS를 이용한다 DNS는 도메인 이름과 IP주소를 저장하고 있는 데이터 베이스로 웹 브라우저가 URL을 요청할 때 그 도메인에 맞는 IP주소를 제공한다.


 이러한 과정으로 클라이언트가 요청을 하면 그 요청에 맞게 웹 서버가 응답한다.

 처음에  웹 서버에 대해 알아볼 때 어떻게 클라이언트와 웹 서버가 통신을 하는지 궁금해서 알아본 내용이다. 



이제부터 본격적인 주제인 웹 서버와 웹 어플리케이션 서버 (WAS)에 대해 알아보자!


 웹 서버 (Web Server)

 

 클라이언트(웹 브라우저)로 부터 HTTP 방식으로 정적인 자원을(html, css, 이미지 등) 요청 받아  그에 맞는 응답을 제공해주는 프로그램 이다. 또 자체적으로 처리할 수 없는 동적인 자원(JSP, PHP, ASP.net, DB연동 등)을 웹 컨테이너로 넘겨주고 컨테이너에서 처리한 결과를 다시 받아 클라이언트에게 제공해주는 역할을한다.


 대표적으로 Apache, IIS(Internet Information Server), WebtoB 등이 있다.


  *정적/동적 자원의 차이: 전자는 네이버에서 네이버 로고같이 파일이 바뀌기 전까지 같은 내용을 보여주는 것 이고 

실시간 검색순위 같이 시간이나 특정 조건에 따라 응답 데이터가 달라지는 자원을 후자라고 한다.


 컨테이너 (Containner)


 웹 서버가 보낸 JSP, PHP, ASP.net등의 파일을 실행하고 수행 결과를 다시 웹 서버로 보내주는 역할을 한다. 


 대표적으로 자카르타 톰캣, RESIN, 웹로직, 웹투비 등이 있다.


 


 웹 어플리케이션 서버 (Web Application Server)

 

 웹 서버와 웹 컨테이너가 합쳐진 형태.

인터넷 상에서 HTTP를 통해 어플리케이션을 수행해 준다. 동적 서버 콘텐츠를 수행하는 것으로 일반적인 웹 서버와 구별이 되며 주로 데이터베이스 서버와 같이 수행이 된다. 


 대표적으로 톰캣 BEA사의 Web Logic, IBM사의 Web Sphere, T-max사의 Jeus, Redhot사의 JBoss 등이 있다.

  웹 서버와 WAS는 동적 컨텐츠를 직접 수행할 수 있는가? 로 차이점을 둘 수 있겠다.



그럼 WAS 만 쓰면 되지 않는가???? 


 많이 쓰는 아파치 톰캣으로 설명 하겠다.

WAS 에는 웹 서버와 웹 컨테이너가  모두 있어 문제가 없어보인다. 하지만 과거 톰캣5.5 이하때는 WAS 가 단독으로 정적,동적 처리를 하면 부하가 많이 걸려 서버의 부담이 늘어 속도 저하가 있었다. 그래서 대규모의 서버는 톰캣을 단독으로 사용하지 않고 아파치를 앞에 두었다. 

 하지만 5.5버전 이상의 톰캣은 httpd의 native 모듈을 사용하여 정적인 페이지를 처리하는 기능을 제공하기에 완전히 아파치와 동급의 속도를 자랑한다. 그러면 단독으로 써도 되지 않는가????


 답은 아니다.

톰캣은 특성상 java언어만 해석 가능하기 때문에 JSP같은경우 처리를 하지만 PHP는 실행이 불가능하다. 따라서 하나의 서버에서 JSP PHP를 모두 사용하고 싶다면 아파치와 톰캣 모두 사용해야 한다.


++로드밸런싱을 위해서도 같이 사용한다는데 추후 알아볼예정




참고

http://limmmee.tistory.com/4

http://reizeo.tistory.com/entry/%EC%9B%B9%EC%84%9C%EB%B2%84WebServer-%EC%9B%B9%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88WebContainer-%EC%9B%B9%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%84%9C%EB%B2%84Web-Application-Server-%EC%9B%B9%EC%84%9C%EB%B2%84%EC%99%80-%EC%9B%B9%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%84%9C%EB%B2%84%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90?category=300418

http://jeong-pro.tistory.com/84

http://gap85.tistory.com/entry/WAS-%EC%99%80-%EC%9B%B9%EC%84%9C%EB%B2%84-%EC%9D%98-%EC%B0%A8%EC%9D%B4

http://hyoje420.tistory.com/5




'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26
Base64  (0) 2018.06.26
  1. 2020.12.02 23:39

    비밀댓글입니다

  3 Way-Handshake 란 전송 제어 프로토콜(TCP)에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정, 방법이다. 

 더 자세하게 설명하기전에 상위 개념부터 간단히 알아보자.


 먼저  네트워크란 데이터를 교환하기 위해 전송 매체를 매개로 서로 연결되어 있는 것이고 인터넷은 전세계 컴퓨터들이 서로 연결되어있는 거대한 네트워크를 뜻한다.

 사람간의 대화에서 같은 언어를 이용해 의사소통 하듯 네트워크 상에서 데이터를 주고받기 위해서 일종의 정해진 규약이 있는데 이것을 프로토콜이라고 부른다.

 

 네트워크 상에서 정보를 주고받으려면 어느 경로로 보낼지 어떤 방식으로 데이터를 보낼지 등등 고려해야할 사항이 많다. 만약 하나의 규약을 정해놓았다면 문제가 발생 하였을시 전체를 바꾸어야 하고 또 문제가 발생하기도 쉬울 것이다. 그래서 역할을 나누어 네트워크는 네트워크 계층 구조를 가지게 되었다. 각각의 계층은 모듈단위로 독립적이지만 서로 상호 유기적인 관계를 가진다.



 

OSI 7계층, TCP/IP 4계층


 TCP/IP 계층을 보면 크게 4개로 나누어져 있고 각각의 계층마다 하는 역할이 다르고 각각의 여러 프로토콜이 존재한다. 이것을 다 알아보는거는 주제에 벗어나는 것 같으므로 TCP가 속해있는 Transport Layer 즉 전송 계층만 간단히 설명하자면

 두 호스트 간에 연결을 맺고 최종적인 통신 목적지까지 데이터를 전달하는 기능을 한다. 


 전송 계층에는 크게 TCP(Transmission Control Protocol) 와 UDP(User Datagram Protocol) 2가지 프로토콜이 있다.


-TCP 연결지향적이며 오류제어, 흐름제어, 혼잡제어, 타이머재전송 등의 기능을 하며 연결지향이란말은 데이타를 전송하는 측과 데이타를 전송받는 측에서 전용의 데이타 전송 선로(Session)을 만든다는 의미이다. 데이타의 신뢰도가 중요하다고 판단될때 주로 사용된다.


-UDP 비연결지향이며, 최소한의 오류제어 기능만 수행한다. 단순히 데이타를 받거나, 던져주기만 하는 프로토콜이다. UDP는 특히 실시간 멀티미디어 정보를 처리하기 위해서 주로 사용한다.



 여기서 딱 보이는 둘의 차이는 연결 비연결이 보인다. 

서두가 길었다. TCP에서 연결지향적인 특성을 갖게 해주는 과정, 방법이 바로 3 Way-Handshake 방식이다.


 간단하게 비유를 들어 설명하자면 a가 b에게 1. b야 내말 잘 들리니?  b가 a에게 2. 응 잘들려 a야 너도 내말 잘 들리니? 3. 응 잘들려! 과 같은 방법으로 서로 의사소통이 할 환경이 잘 구성 되었는지, 즉 연결이 잘 되었는지 확인하는 과정이다.


 네트워크 상에서는 서로 패킷을 주고받아 위 과정을 수행한다. 



 * TCP의 3-way Handshaking 과정

 SYN 은 synchronize sequence numbers ACK는 acknowledgements 의 약자.


[STEP 1]

 A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태  가 되는 것이다.

 

[STEP 2] 

 이때 서버는 Listen 상태로 포트 서비스가 가능한 상태여야 한다. (Closed :닫힌상태) B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.

 

[STEP 3]

 A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다. 이때의 B서버 상태가 ESTABLISHED 이다.

 위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식이다.





 출처: http://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake [Mind Net]


 이렇게 3번의 신호를 주고받는다 해서 3-way Handshaking 이다.


                             과정

 1번에 seq넘버를 보내고

 2번에 ack로 1번인 넘버에 1이 추가되었음을 알 수 있다.

 동시에 서버역시 seq넘버를 보낸다

 3번 클라이언트의 ack도 서버가 보낸 seq넘버에 1이 더해졌다


 이런식으로 랜덤한 숫자를보내고 잘받았다는 ack로 1을 더해주는 방식을 사용한다.


 위 방식을 통해 TCP는 연결지향적인 특성과 자체적으로 오류를 처리하며 순서가 뒤바뀐 패킷을 교정해주는 기능이 더불어 주로 데이터의 신뢰도가 중요하다고 판단되어질 때 쓰인다. 

 신뢰도 확보가 중요하거나 용량이 큰 데이터를 전달해야 때, 실시간일 필요는 없을 때 활용 된다.


 하지만 데이터의 신뢰성 보다 전송 속도가 중요시되는 경우면 어떨까? 스트리밍 서비스 같은 경우 속도가 생명이다. 만약 계속해서 버퍼링이 걸린다면 사용자는 매우 불쾌할 것이다. 


 앞서 말한 UDP 프로토콜은 위와 같은 과정이 없이 단순히 데이터만을 전송하므로 속도가 빠르다. 스트리밍  서비스 같은경우 약간의 화질이나 음질의 손상이 있다 해도 끊기지 않는 서비스가 중요하다. 그래서 UDP방식을 사용한다.




 추가++

이 3way handshaking의 취약점을 이용해 서버를 공격 하는 방법이 있는데 이를 SYN Flooding 이라한다


 3way handshaking 과정중 서버는 2단계 에서 (클라이언트로 부터 요청을받고 응답을 하고난후 다시 클라이언트의 응답을 기다리는 상태)  이 연결을 메모리 공간인 백로그큐(Backlog  Queue) 에 저장을 하고 클라이언트의 응답 즉 3단계를 기다리게 되고 일정 시간 (default 로 UNIX/LINUX : 60초 , Windows : 256초 , Apache : 300 초이며 수정 가능) 동안 응답이 안오면 연결을 초기화한다.


 바로 이 점을 이용한 공격법이다.


 악의적인 공격자가 실제로 존재하지 않는 클라이언트IP로 응답이 없는 연결을 초기화 하기전에 또 새로운 연결 즉 1단계 요청만 무수히 많이 보내어 백로그 큐를 포화 상태로 만들어 다른 사용자로 부터 더이상에 연결 요청을 못 받게 하는 공격 방법이다.


대응책으로는 연결 타이머 시간을 짧게 하거나 백로그 큐 사이즈를 늘리는법, 정해진 시간동안 들어오는 연결 요구의 수를 제한하는법, 쿠키(cookie)라는 것을 이용해서 전체 연결이 설정되기 전까지는 자원의 할당을 연기하는 법이 있다..







참조

https://blog.naver.com/ljh0326s/220846406187

http://copycode.tistory.com/30?category=740132

http://www.hoons.net/board/cshaptip/content/35343

https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP

http://isecure.tistory.com/29

http://tip.daum.net/openknow/13047294

http://www.ktword.co.kr/test/view/view.php?nav=2&id=1104&m_temp1=774

'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26
Base64  (0) 2018.06.26

알아보니 먼저 문자집합 (Character Set) 과 인코딩 (Encoding) 의 차이점을 알고 가야 할 것 같다.


 문자집합 (Character Set)은 정보를 표현하기 위한 글자나 기호들의 잡합을 정의한 것이다. 

음 쉽게 말해보면 번호를 매긴 문자들의 집합, 즉 키와 값이 1대1로 매핑 되어있는 것이다. 문자집합의 예로 아스키 코드, 유니코드 등이 있다.


 인코딩(Encoding)은 어떤 형태의 정보를 다른 형태로 바꾸는 것이다. 문자 집합도 일종의 인코딩이다.



 자 그럼 오늘의 토픽 주제인 유니코드와 utf-8,16 은 이렇게 생각해볼 수 있다.

유니코드는 전세계~ 언어를 모두 한 코드체계 안에 담기위해 만들어진 문자집합이고 utf-8,16은 그 유니코드를 사용하는 인코딩 방식이다!


탄생배경

 

 아주 간단히 말하면.. 초창기의 컴퓨터에는 표준 문자셋이 없었다. 그래서 표준 문자셋인 아스키코드가 나왔다. 하지만 이는 영어표기를 위함이었고 다른 나라의 언어를 사용하기엔 부족했다. 이를 해결하기위해 많은~ 문자셋이 개발 되어 왔고 전 세계 언어를 모두 표현하기 위해 유니코드라는 문자셋이 나오게 되었다. 


현재 유니코드에는 조합 가능한 모든 한글 음절이 수록되어 있다. (19*21*28 = 11,172)


위 그림은 유니코드 인코딩과 타 인코딩과의 관계이다. 

대표적으로  UTF-8 UTF-16 UTF-32 에 대해서 알아보자


 UTF-8 8비트 단위로 인코딩하는 방식이다. 


가변형 인코딩 방식으로 한글자를 1~4바이트로 표현한다. 

 설계원칙 으로 다음 세가지가 있다.

  • 1바이트로 표시된 문자의 최상위 비트는 항상 0이다.
  • 2바이트 이상으로 표시된 문자의 경우, 첫 바이트의 상위 비트들이 그 문자를 표시하는 데 필요한 바이트 수를 결정한다. 예를 들어서 2바이트는 110으로 시작하고, 3바이트는 1110으로 시작한다.
  • 첫 바이트가 아닌 나머지 바이트들은 상위 2비트가 항상 10이다.


변환 과정

 문자 "위" (U+C704) 는 다음과 같이 인코딩된다.

범위상 3바이트 즉 1110xxxx 10xxxxxx 10xxxxxx 형식으로 인코딩된다.

16진수 C704를 2진수로 바꾸면 1100 0111 0000 0100 이다.

이 수를 순서대로  x에 넣는다 11101100 10011100 10000100

이렇게 한글은 3바이트로 인코딩된다. (16진수로 EC 9C 84)


 UTF-8이 이런 성질을 가지도록 설계한 까닭은 어떤 경우에도 한 문자에 대한 바이트 표현이 다른 문자에 대한 바이트 표현의 일부가 되는 경우가 없도록 하기 위함이다.


이러한 설계 원칙 과 가변형 방식이라는 특징 때문에 여러 장점이 있다.

 바이트 경계를 순서대로 혹은 역순으로 찾기 쉽고 첫 바이트만 사용하여 해당 바이트 길이를 결정할 수 있다. 아스키코드 문자열과 호환성이 좋으며 (아스키인코딩은 utf-8의 부분집합, 하위 호환성 보장) 바이트 단위 문자열 검색 알고리즘을 그대로 사용 할 수 있다.


utf-16 과 비교하여 한중일 문자를 안쓰면 최소 2바이트를 사용하는 16보다 더 작은 크기로 표현할 수 있다. 

역으로 utf-16보다 한중일 문자만을 사용 할때는 더 많은 크기를 차지한다.


  




 UTF-16 16비트 단위로 인코딩하는 방식이다.

 최소 2바이트부터 최대 4바이트까지 인식한다. 기존 다국어 평면(BMP)는 2바이트로 그 이상의 문자는 4바이트로 인코딩이 된다 아스키와 호환이 어렵고 한중일 문자들이 2바이트로 표현되어서 한중일 언어를 인코딩 할 때 에는 utf-8 을 쓸 때 보다 크기가 작아 진다.



  UTF-32 모든 글자를 4바이트로 표현한다.

 모든 문자들을 4바이트로 동일하게 표현한다. 만약 이방식으로 전 시스템이 통일된다면 인코딩 변환이 필요없는 세상이 될 것이다. 하지만 저장공간의 낭비가 심하다는 단점이 있다. 



 저장기술이 더 발전 되어지고 기존 인코딩 방식을 고수하던 프로그램들이 바뀌면 언제가는 UTF-8과 같은 방식으로 통일이 되어지지 않을까? 생각이 든다.


참고 

http://norux.me/31 

https://d2.naver.com/helloworld/19187

http://nuli.navercorp.com/sharing/blog/post/1079940

http://www.allofsoftware.net/2015/06/9.html



'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26
Base64  (0) 2018.06.26
  1. 강수길 2020.05.30 12:27

    안녕하세요! 글 너무 잘 봤습니다.
    UTF8에서 어떤 한 글자의 인코딩값이 다른 글자의 인코딩의 서브셋이 "안"되도록 하기 위해 UTF8처럼 1110 110 10을 붙여 인코딩한다고 하셨는데.. 서브셋이 되지 않는다면 어떤 장점이 있을까요? 생각을 해봐도 답이 나오지 않아 질문드립니다.

    • 졸린눈 2020.05.30 16:22 신고

      우선 다른 문자의것으로 혼동되는 것을 막기때문에 어떤 긴 텍스트에서 원하는 부분 텍스트를 찾을때 보다 쉬운 알고리즘을 적용할 수 있고 (만약 하나의 문자가 다른문자의 서브셋으로도 사용된다면 해당 문자인지 서브셋인지 확인이 필요할 것 같습니다)
      또 하나 이상의 바이트들이 손실되었을 때도 다음의 정상 문자를 찾아내어 피해를 최소화 할 수 있다는 장점이 있다고 합니다!.
      http://z3moon.com/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C
      https://ko.wikipedia.org/wiki/UTF-8
      를 참조했습니다.

  2. D 2020.08.20 18:26

    Ansi C 정도의 프로그래밍을 하다가, 가끔 윈도우용 프로그램을 짤 일이 생깁니다.
    wstring, string, unicode, utf-8 등에 대해서 좀 더 정확하게 이해하려, 여러웹사이트를 돌아다니고 있습니다.
    utf-8 에 대해 잘 설명해주셔서, 도움이 많이 되었습니다. 감사합니다.

Base64 란


 8비트 이진 데이터를 64개의 문자를 이용하여  공통 아스키 문자로 표현하기 위해 만들어진 인코딩 방식이다. 

 

 Base64를 글자 그대로 직역하면 64진법이라는 뜻이다. 64진법은 컴퓨터한테 특별한데 그 이유는 64가 2의 제곱수 64=2^6이며 2의 제곱수에 기반한 진법 중 화면에 표시되는 ASCII 문자들로 표시할 수 있는 가장 큰 진법이기 때문이다. (ASCII에는 제어문자가 다수 포함되어 있기 때문에 화면에 표시되는 ASCII 문자는 128개가 되지 않는다.)


 구체적으로 A~Z, a~z, 0~9 까지의 62개 문자와 +,/의 2가지 기호가 사용되며 남은 부분은 = 기호로 채워진다. 


 인코딩시 약 33% 정도 데이터의 양이 늘어나는 특징이 있다.


Base64 동작 원리


  24비트 버퍼에 바이너리 데이터를 6비트씩 자르고 6비트를 10진수로 변환한 뒤, 해당 10진수에 대응하는 Base64 색인표에 값을 찾아 치환한다. 24 비트(3바이트)씩 가져오기 때문에 그보다 작은 값이 들어오면 = 으로 채워준다. 이것은 원본으로 되돌릴 때 원본에 없던 비트가 생겨나는 것을 방지하기 위함이다.





위 사진은 a라는 문자를 인코딩하는 예이다. 위 설명과 같이 남은 6비트 2개의 영역을 = (패딩) 처리 해주었다.



쓰이는 이유


 Base64 인코딩을 하게되면 데이터의 양이 약33% 늘어난다. 6비트당 2비트의 오버헤드가 발생하기 때문이다. 이렇게 데이터의 크기가 증가 하는데 왜 쓰일까

 문자를 전송하기 위해 설계된 이메일등에서  이미지나 오디오를 전송 할 필요가있을때, 아스키코드로 인코딩 하게되면 문제가 발생할 수있다. 

 1. 아스키는 7비트 인코딩인데 대부분 8비트로 만들어진 데이터 형태를 갖는다.

 2. 아스키 코드 안에는 화면에 표시되지 않는 제어문자가 포함 되어 있고일부 제어문자 (e.g. Line ending)의 경우 시스템 별로 다른 코드       값을 갖는다.


 위와 같은 문제로 아스키는 데이터 전달하는데에 위험성이 있다. Base64는 아스키중 제어문자를 제외한 64개의 안전한 출력 문자만 사용 하기 때문에 사용 되어 진다.


즉 이메일과 같이 문자를 위한 곳에 이진 데이터로 나타내어질 수 있는 파일을 시스템 독립적으로 동일하게 전송 하기위해 쓰인다 라고 정리 할 수 있을 것 같다. 


 이렇게 base64는 바이너리 데이터를 어느 문자셋에나 있는 아스키코드 기반 기본문자로 인코딩을 해준다. 이렇게 인코딩된 데이터를 받으면 디코딩만 해주면 온전하게 데이터를 받을 수 있는 것이다.


 가장 핵심은 아스키코드 기반 기본문자로만 표현이 되기 때문에 호환성이 좋다는 것 즉 데이터를 온전히 전송 가능하다는 점이다.

어느 시스템에서 어떤 시스템(문자셋) 으로 받던 인코딩 하고 디코딩 해서 받으면 깨짐없이 데이터가 전송 가능하다는 것!


쓰임새


 암호화된 원문을(바이너리파일) 저장,전송 할때 base64로 다시한번 인코딩 하고 쓰인다. 암호화된 파일도 어딘가에는 저장이 필요할 텐데 저장을 돕는 프로그램도 (db) 어느 문자셋을 기반으로 할 것이고 그럼 그곳에 바이너리 파일 그대로를 넣으면 데이터는 깨지게 될 것이다. 하지만 암호화된 파일(바이너리)을 다시한번 base64로 인코딩하면 식별가능한 아스키코드 기반 기본문자로 바뀌고 이것을 저장하면 문제가 생기지 않는다.


 예를 들어 사용자 비밀번호와 같은 데이터는 DB에 저장 될 때 원문 그대로가 아닌 암호화(단방향 암호화) 되어 저장 되어지는 것이 필요하다. 데이터 유출시 비밀번호 유출을 막기 위함이다. DBMS는 사람이 보고 인식하는 곳으로 지정된 문자셋이 있는데  이때 sql문으로 데이터를 넣을때 암호화된데이터(바이너리)를 그대로 넣으면 정해진 DBMS 문자셋 에 의해 암호화된데이터가 깨지게 된다. 그래서 암호화된데이터를 한번더 base64로 인코딩 해주고 DBMS에 넣으면 관리가 용이해진다.


 여담- 단방향 암호화= 원문을 암호화하는 알고리즘은있지만 이를 복호화하는 키가 없는 기법. 


사용자의 비밀번호를 단방향 암호화로 저장하고 (유출방지) 다시 사용자가 비밀번호를 입력할때 입력된 비밀번호를 암호화하고 초기에 설정된 암호화된 비밀번호랑 비교하는 방식으로 검증을 하면 된다.

  



참고 

http://effectivesquid.tistory.com/26

https://okky.kr/article/276104


'개념' 카테고리의 다른 글

[Windows10] 윈도우10 hosts파일 수정하기  (0) 2019.01.22
Jsp Php Asp ?  (1) 2018.07.27
웹서버와 웹 어플리케이션 서버 (WAS)  (1) 2018.07.06
TCP 3 Way-Handshake  (0) 2018.06.27
유니코드와 utf-8 utf-16  (3) 2018.06.26
Base64  (0) 2018.06.26

+ Recent posts