■ HashMap

1. 정의

  • HashMap은 key와 value 값으로 구성된다
    - HashMap(key, value)
    - key 값은 중복되면 않된다
    - value 값은 중복될 수 있다 
  • HashMap = Hash Table 에 저장 = 배열(Array) + 링크드리스트(LinkedList) 로 구성된다
  • HashMap은 순서를 유지하지 않아도 된다
     - 순서를 유지하고 싶다면 LikedHashMap을 사용하면 된다
  • HashMap은 Hashing 기법으로 만들어진다
HashMap map = new HasgMap();
map.put("key", "value");  //저장하기 위한 명령어로 put를 사용한다
  • key와 value 값 한쌍을 Entry라고 한다

2. Hashing

  • hash function은 key값을 받아서 해당되는 index 값(저장위치)을 반환하는 함수이다
  • 반환되는 index 값을 hash code라고 한다
  • hash 함수를 이용하여 hash 테이블에 데이터를 저장하고 반환하는 작업을 hashing이라고 한다
    - key값이 같으면 항상 같은 값을 반환한다
    - key값이 달라도 같은 값을 반환할 수 있다
  • hash table은 배열과 링크드 리스트의 조합이다
    - 배열의 접근성과 링크드리스트의 변경 용이성을 모두 가지고 있다

3. HashMap 메서드

 1) HashMap

  • HashMap()
  • HashMap(int initialCapacity)
  • HashMap(int initialCapacity, float loadFactor)
  • HashMap(Map m)

 

 2) Object Method

  • Object put(Object key, Object value)
    - 데이터를 저장할 때 사용한다
    - key와 value를 묶어서 저장한다(key=value)
  • void putAll(Map m)
    - 지정한 Map m의 값을 모두 저장할 때 사용한다
  • Object remove(Object key)
    - key 데이터를 삭제할 때 사용한다
  • Object replace(Object key, object value)
    - 지정한 key의 value를 변경할 때 사용한다
  • boolean replace(Object key, Object oldValue, Object newValue)
    - 지정한 key에 해당되는 value를 변경할 때 사용한다

 3) HashMap에 저장된 데이터를 읽어오는 Method

  • Set entrySet()
    - key와 value 쌍으로 구성된 데이터를 호출한다
  • Set keySet()
    - key 데이터만 호출한다
  • Collection value()
    - value 데이터만 호출한다

 4) HashMap에 저장된 데이터를 조회하는 Method

  • Object get(Object key)
    - 지정한 key에 해당하는 value를 반환한다
  • Object getOrDefault(Object key, Object defaultValue)
    - 주어진 key가 데이터에 없을 경우, 지정한 defaultValue 데이터를 반환한다
  • boolean containsKey(object key)
    - 주어진 key가 key 데이터에 있는지 여부를 확인한다
    - true / false 로 반환한다
  • boolean containsValue(Object vaalue)
    - 주어진 value가 value 데이터에 있는지 여부를 확인한다
    - true / false 로 반환한다

 5) 정량적 Method

  • int size()
    - 데이터의 크기를 확인한다
    boolean isEmpty()
    - 데이터가 비었는지 확인한다
  • void clear()
    - 데이터를 삭제한다
  • Object clone()
    - 데이터를 복제한다

 

4. 예제

import java.util.HashMap;
import java.util.Scanner;

public class HashMap_IdPw {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("Id1", "1111");
        map.put("Id2", "2222");
        map.put("Id3", "3333");
//        System.out.println(map);

        Scanner scanner = new Scanner(System.in);

        while (true) {  //반복문을 실행
            System.out.println("Id와 Pw를 입력하세요");
            System.out.println("Id : ");
            String id = scanner.nextLine().trim();  //trim 은 앞 뒤 공백을 없애준다
            System.out.println("Pw : ");
            String pw = scanner.nextLine().trim();

            System.out.println();  //줄바꿈 역활

            if (!map.containsKey(id)) {  //containsKey는 key 값 전체를 가리킨다
                System.out.println("일치하는 id가 없습니다" + "\n" + "다시 입력해 주시기 바랍니다");
                continue;  //다음 반복 while 문으로 이동
            }

            if (!map.get(id).equals(pw)) {  //get(id)는 key 값 중에 id와 일치하는 값이 있으면  value 값을 반환한다
                System.out.println("비밀번호가 일치하지 않습니다" + "\n" + "다시 입력해 주시기 바랍니다");
            } else {  //id와 pw가 일치하면 문장 출력 후 반복문 털출
                System.out.println("id와 비밀번호가 일치합니다");
                break;
            }
        }
    }
}
import java.util.*;

public class HashMap_SumAverage {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("kim", 90);
        map.put("lee", 50);
        map.put("cha", 80);
        map.put("park", 100);
        map.put("choi", 70);
//        System.out.println(map);

        //전체 map에 저장된 데이터에서 값을 호출,조회하는 코드

        Set set = map.entrySet();  //map에 저장된 데이터를 key,value 쌍으로 호출한다
        Iterator iter = set.iterator();  //set에 데이터가 남아 있는지 확인한다

        while(iter.hasNext()) {
            Map.Entry me = (Map.Entry)iter.next();  //Map 인터페이스 안의 Entry 인터페이스
            System.out.println("이름 : " + me.getKey() + ", 점수 : " + me.getValue());
        }

        //전체 map에서 key 데이터만을 호출하는 코드
        set = map.keySet();  //key에 저장된 값만 가져온다
        System.out.println("참가자 명단 : " + set);

        //전체 map에서 value 데이터만을 호출하는 코드
        Collection values = map.values();  //value 데이터를 가져온다
        iter = values.iterator();

        int total = 0;

        while(iter.hasNext()) {  //hasNext()는 읽어 올 요소가 남았는지 확인한다
            int i = (int)iter.next();  //next() 메소드는 읽어 올 요소가 남았는지 확인한다
            total = total +i;
        }

        System.out.println("총점 : " + total);
        System.out.println("평균 : " + (float)total/set.size());  //정수로 결과값이 나오므로 float로 형변환 해 준다
        System.out.println("최고점수 : "+ Collections.max(values));
        System.out.println("최저점수 : "+ Collections.min(values));
   }
}

 

 

 

'JAVA' 카테고리의 다른 글

Java - HashMap 활용 - 합계, 평균  (0) 2022.09.14
Java - 문자열 바꾸기 - replace  (0) 2022.09.13
Java - Static  (0) 2022.08.14
Java - 문자열 입력(Scanner, BufferReader)  (0) 2022.08.08
Java - 날짜(Date), 시간(Time)  (0) 2022.08.08

1. 해싱(Hashing)

  • 인증을 거치지 않고 단순하게 정보를 요청하고 응답한다면 누구나 접근이 가능하다

  • 간단한 password를 이용하여 인증을 진행하는 방식은 위험성이 매우 높다
    - DB가 타인으로부터 공격을 받아서 password가 노출된다면 클라이언트가 이용하고 있는 다른 애플리케이션까지 피해를 줄 수 있다

  • 암호화(encryption)는 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환하여, 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 '알고리즘'을 이용해 정보를 관리하는 과정이다
  • 예를 들어 입력받은 문자열을 입력받은 숫자의 값 만큼 알파벳 순서를 건너뛴 문자로 변환하여 새로운 문자열을 반환하도록 한다
    - 단순하고 간단하지만 암호화에 속한다
    - 아래는 예제 코드이다
package CA.example;

public class Hashing {
    public static String shiftBy(String content, int offset) {
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < content.length(); i++) {
            char shiftByOffset = (char)(content.charAt(i) + offset);
            result.append(shiftByOffset);
        }
        return result.toString();
    }

    public static void main(String[ ] args) {
        shiftBy(content:"apple", offset: 2);   //crrng 문자열 반환
        shiftBy(content:"crrng", offset: -2);  //apple 문자열 반환
    }
}

 

2. 쿠키(cookie)

  • 서버에서 클라이언트에 데이터를 저장하는 방법이다
  • 서버는 클라이언트에게서 쿠키를 이용하여 데이터를 가져올 수 있다
  • 서버가 클라이언트로부터 데이터를 가져오기 위해서는 특정 조건들을 만족해야 한다
  • 쿠키의 특성을 이용하여 서버는 클라이언트에 인증정보를 담은 쿠키를 전송한다
  • 클라이언트는 전송받은 쿠키를 이용하여 무상태성인 인터넷 연결을 안전하게 유지할 수 있다
  • 쿠키는 오랜 시간 유지될 수 있고 자바스크립트에서 접근이 가능하므로 보안에 취약하다

 1) 데이터를 가져오기 위한 쿠키 옵션

URL

  • 도메인(Domain)
    - 쿠키에서 도메인은 도메인 이름만 포함한다
    - 쿠키 옵션에서 도메인은 포트 및 서브 도메인 정보와 세부 경로를 포함하지 않는다
    - 클라이언트의 쿠키 옵션에 도메인 정보가 존재하고 도메인 옵션과 서버의 도메인이 일치하면 쿠키를 전송한다

 

  • 패스(Path)
    - Path는 세부경로이며 서버가 라우팅할 때 사용하느경로이다
    - 기본적으로 '/'으로 표시한다
    - path 옵션은 /file.html로 설정되어 있다면 file.html/user/username의 경로라도 /file.html을 만족하므로 쿠키 전송이 가능하다
  • MaxAge or Expires
    - 쿠키가 유효한 기간을 설정하는 옵션이다
    - 쿠키의 유효기간이 정해져 있지 않으면 탈취하기가 쉬워지므로 보안 측면에서 중요한 옵션이다
    - maxAge는 몇 초 동안 유효할 지를 설정하는 옵션이다
    - Expires는 클라이언트의 시간을 기준으로 유효한 날짜와 시간을 지정하는 옵션이다
      : 지정한 날자와 시간을 초과하면 쿠키는 자동으로 삭제된다
    - 세션 쿠키는 MaxAge나 Expires 옵션과 상관없이 크라우져가 실행 중에만 사용할 수 있는 쿠키이며, 브라우져가 종료되면 자동으로 삭제되는 쿠키이다
    - 영속성 쿠키는 브라우져의 종료 여부와 관계없이 MaxAge와 Expires 옵션에 지정된 내용만큼 사용 가능한 쿠키이다
  • Secure
    - 쿠키를 전송할 때 프로토콜 옵션에 따라 전송 여부를 결정한다
    - true로 옵션이 설정되어 있으면 HTTPS 포로토콜을 이용하는 경우에만 쿠키를 전송할 수 있다
    - 옵션 설정이 없다면 HTTP와 HTTPS 모두 쿠키를 전송할 수 있다
  • HttpOnly
    - 자바스크립트에서 브라우져의 쿠키에 접근을 허용할 것인지를 결정한다
    - true 옵션으로 설정되어 있으면 자바스크립트에서 쿠키에 접근이 불가하다
    - 옵션 설정이 없는 경우에 기본적으로 false 값으로 지정된다
    - false 값으로 지정되어 있으면 자바스크립트에서 쿠키에 접근이 가능하여 XSS 공격에 취약해 진다
  • SameSite
    -  Cross-Origin 요청을 받은 경우에는 사용한 메서드와 해당 옵션(get,post,put,patch,...)의 조합에 따라 서버의 쿠키 전송 여부를결정한다
    - 사용 가능한 옵션
      → Lax : Cross-Origin 요청이면 'GET'메서드에 대해서만 쿠키를 전송할 수 있다
       Strict : Cross-Origin 요청이 아닌 same-site 경우에만 쿠키를 전송할 수 있다
       None : 항상 쿠키를 전송할 수 있지만, Secure 옵션이 있는 경우에 한하여 전송한다
      
    - same-site는 요청을 보낸 Origin과 서버의 Domain, Protocol, Port가 같은 경우를 의미한다
    - 요청을 보낸 Origin과 서버의 Domain, Protocol, Port가 하나라도 다르면 Cross-Origin으로 구분한다

 2) 쿠키 전송

  • 서버에서 클라이언트로 쿠키를 처음 전송할 때에는 Header에 Set-Cookie 라는 프로퍼티에 쿠키를 담아 전송한다
  • 이후 쿠키를 전송할 경우에는 클라이언트는 Header에 Cookie라는 프로퍼티에 쿠키를 담아 서버에 전송한다

 

3. Session

  • 클라이언트가 인증에 성공한 상태를 Session이라고 한다
  • 서버는 in-memory, 세션스토어(redis 같은 트랜젝션이 빠른 DB)에 세션을 저장한다
  • 세션이 만들어지면 세션 id가 생성되고 인증된 클라이언트에게 전달된다
  • 클라이언트는 서버에서 발급한 세션 아이디를 쿠키에 저장하고 사용한다
  • 쿠키에 저장된 데이터는 보안에 취약하므로 사용이 종료되면 삭제해야 한다
  • 서버가 클라이언트의 쿠키를 임의로 삭제할 수는 없지만, set-cookie로 클라이언트에게 쿠키를 전송할 때 세션 아이디의 키값을 무효한 값으로 갱신할 수 있다

 

 

 

 

※ 참조 링크

 교차 출처 리소스 공유 (CORS) : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

 

교차 출처 리소스 공유 (CORS) - HTTP | MDN

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라

developer.mozilla.org

Same-origin Policy : https://en.wikipedia.org/wiki/Same-origin_policy

 

Same-origin policy - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Security measure for client-side scripting In computing, the same-origin policy (sometimes abbreviated as SOP) is an important concept in the web application security model. Under the

en.wikipedia.org

사이트 간 요청 위조 : https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9D%B4%ED%8A%B8_%EA%B0%84_%EC%9A%94%EC%B2%AD_%EC%9C%84%EC%A1%B0

 

사이트 간 요청 위조 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

Set-Cookie Attributes : https://urclass.codestates.com/53317456-fd52-431d-802c-28a53dc3735a?playlist=2338

 

Set-Cookie - HTTP | MDN

The Set-Cookie HTTP response header is used to send a cookie from the server to the user agent, so that the user agent can send it back to the server later. To send multiple cookies, multiple Set-Cookie headers should be sent in the same response.

developer.mozilla.org

 

'인증 & 보안' 카테고리의 다른 글

Spring Security - 환경 구성  (0) 2022.07.26
웹 보안 공격  (0) 2022.07.23
인증 - HTTPS  (0) 2022.07.21

1. HTTPS (Hyper Text Transfer Protocol Secure Socket layer)

  • HTTP + Secure 의 합성어이다
  • HTTP over SSL(TLS), HTTP over Secure 라고도 한다
  • HTTP 프로토콜에 보안성이 추가된 시스템이다
  • HTTP 요청을 SSL 또는 TLS 알고리즘을 이용하여 HTTP 통신을 하는 과정에서 데이터를 암호화하여 전송한다
  • 접속하는 웹사이트의 왼족 자물쇠를 클릭하면 보안 정보가 나타난다

 

2. HTTPS 특징

 1) 암호화

  • 클라이언트와 서버가 데이터를 암호화하여 주고받기 위해 비대칭키 방식과 대칭키 방식을 혼용하여 사용한다
  • 대칭키 방식은 양쪽이 공통의 비밀 키를 공유하여 데이터를 암호화 및 복호화한다
  • 비대칭키 방식은 각각 공개키(public key)와 비밀키(private key)를 가지고 있어서 상대가 공개키로 암호화한 데이터를 개인이 가진 비밀키로 복호화한다
    - 전자서명은 개인키로 암호화하고 공개키로 복호화 한다
    - 암호화는 공개키로 암호화하고 개인키로 복호화 한다

  • 클라이언트와 서버는 한 쌍의 비대칭 암호화 Key를 가지고 있다
  • 클라이언트와 서버 간의 암호화 key를 상호 검증하여 보안을 강화한다
  • 서버가 실행되면서 인증서를 등록하므로 클라이언트는 서버의 공개키를 알 수 있다

 

2) 인증서(Certificate)

  • 데이터 제공 서버가 실제로 데이터를 보내는 서버인지 확인하는 용도이다
  • 서버의 도메인 정보가 포함되어 있어서 데이터 제공자의 인증을 용이하게 한다
  • 서버에서 보내는 응답 정보와 인증서를 함께 확인하여 보안을 강화한다

 

 3) CA(Certificate Authority)

  • 공인 인증서 발급 기관을 CA(Certificate Authority)라고 한다
    - CA는 공인 인증 기관으로 엄격한 기준에 따라 자격이 유지되고 박탈 당할 수 도 있다
    - CA들은 서버의 공개키와 정보를 CA의 비밀키로 암호화하여 인증서를 발급한다
  • 브라우져는 인증서 발급 기관으로부터 발급받은 인증서를 보유하고 있다

Certificate 예시

  • 서버와 클라이언트 간의 CA를 통해 서버를 인증하고 데이터를 암호화하는 과정의 전체 프로토콜을 TLS 또는 SSL이라고 한다
    - SSL과 TLS는 사실상 동일한 규약을 뜻한다
    - SSL이 표준화되며 변경된 이름이 TLS이다

 

3. 인증서 발급

 1) 인증서 지원 형식

  • 자바는 다음과 같은 두 가지의 인증서 형식을 지원한다
    - PKCS12 (Public Key Cryptographic Standards #12)
     : 여러 인증서와 키를 포함할 수 있으며, 암호로 보호된 형식으로 업계에서 널리 사용된다

    - JKS (Java KeyStore)
     : PKCS12와 유사하다
     : 독점 형식이며 Java 환경으로 제한된다

 2) HTTPS 사설 인증서 발급 

  • Spring Initializr에서 기본 웹 서버 프로젝트를 생성한다
  • mkcert 프로그램을 설치한다
    - mkcert 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다
    - mkcert는 PKCS12 형식만 지원합니다.
  • mkcert 프로그램 설치 방법
    - 터미널에 아래 명령어를 입력 후 실행하여 설치한다
WSL 터미널에서 작성한다

$ sudo apt install libnss3-tools

      - 설치가 안되고 에러가 발생할 경우 update를 먼저 진행한다

$ sudo apt update

      - 설치가 되었으면 아래 명령을 입력하고 진행한다

$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64

      - 마지막으로 아래 명령을 입력해 준다

$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

  • 로컬을 인증된 발급기관으로 추가해 준다
    - 아래 명령어를 작성 후 실행하여 CA를 생성한다
$ mkcert -install

  •  PKCS12 인증서를 생성하기 위해 아래 명령을 작성 후 실행한다
$ mkcert -pkcs12 localhost

  • 옵션으로 추가한 localhost에서 사용할 수 있는 인증서가 완성되었다
  • 해당 커맨드를 입력한 위치에 localhost.p12라는 파일이 생성된 것을 확인할 수 있다
  • 저장 경로를 반드시 확인한다 

3) HTTPS 서버 작성

  • Spring Boot를 이용하여 HTTPS 서버를 간단하게 작성할 수 있다
    - 생성된 인증서를 resources 폴더로 이동한다

     - application.properties 에서 관련 설정을 추가한다
      → 비밀번호인 changeit은 비밀번호를 설정하지 않았을 때의 기본값이다
       인증서 비밀번호는 인증서를 생성할 때 설정하거나 생성 후 변경해 줄 수 있다
       비밀번호 설정 방법은 한번 찾아보시기 바랍니다 :)

server.ssl.key-store=classpath:localhost.p12    -> 인증서 경로를 적는다
server.ssl.key-store-type=PKCS12                -> 인증서 형식을 적는다
server.ssl.key-store-password=changeit          -> 인증서 비밀번호를 적는다
  • 이제 서버를 실행해 보면 HTTPS 서버가 작동되는 것을 확인할 수 있다

  • web애플리케이션에서도 확인해 본다
    - 페이지를 생성한 것이 없으므로 white error 가 발생한다

 

 

 

 

 

※ 참고 자료

▶ 중간자 공격 : https://en.wikipedia.org/wiki/Man-in-the-middle_attack

 

Man-in-the-middle attack - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Form of message tampering In cryptography and computer security, a man-in-the-middle, monster-in-the-middle,[1][2] machine-in-the-middle, monkey-in-the-middle,[3] meddler-in-the-middle

en.wikipedia.org

▶ 암호화 : (101) HTTPS가 뭐고 왜 쓰나요? (Feat. 대칭키 vs. 비대칭키) - YouTube

 교차 출처 리소스 공유 (CORS) : https://developer.mozilla.org/ko/docs/Web/HTTP/CORS

 

교차 출처 리소스 공유 (CORS) - HTTP | MDN

교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라

developer.mozilla.org

 

'인증 & 보안' 카테고리의 다른 글

Spring Security - 환경 구성  (0) 2022.07.26
웹 보안 공격  (0) 2022.07.23
보안 - Hashing,Coolie,Seesion  (0) 2022.07.23

+ Recent posts