Spring을 통해 로그인 및 회원가입 시스템을 만들때 비밀번호에 대해서 해시(Hash)가 필요하다는 생각을 하였지만 해시(Hash)와 암호화(Encryption) 의 차이점을 정확히 설명할 수 없었다. 이번기회에 정리하는것이 차후에 진행될 프로젝트에도 많은 도움이 될것같아 작성하게 되었다.

 

차이점

Hash는 평문으로 암호화된 문장으로 만들어 주는 기능이다.

Encryption은 평문으로 암호화 된 문장으로 만들어 주는 기능(즉 Hash의 기능) + 암호화 된 문장을 다시 평문으로 만들어 주는 복호화 기능도 가능다.

즉, Hash는 단방향 암호화 기법이고 Encryption은 양뱡향 암호화 기법이다.

 

해시에서 알아야할 중요한 것들 

1. 해시 알고리즘 및 암호화 알고리즘은 다양항 종류가 존재, 알고리즘은 모두에게 공대 되어있다

2. 해시 알고리즘마다 hash길이가 다르고 보안이 뚫린 해시 함수도 존재

3. 해시 알고리즘은 특정 입력에 대해 항상 같은 해시값을 리턴한다

4. 해시된 값은 입력이 다른 값이지만 같을 수 있다.

 

로그인 및 회원가입 시스템에서 나는 Hash SHA 26을 사용하였다. 아래의 코드는 SHA 265에 관한 코드이다.

진행하는 프로젝트에서 설정한 비밀번호가 제대로 Hash되었는지 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
 
import org.springframework.stereotype.Service;
 
import java.security.MessageDigest;
@Service
public class UserPasswordHash {
    public String getSHA256(String plainText) {
        String shaString = "";
        if(plainText == null){
            return "";
        }
        try {
            MessageDigest sh = MessageDigest.getInstance("SHA-256");
            sh.update(plainText.getBytes());
            byte byteData[] = sh.digest();
            StringBuffer stringBuffer = new StringBuffer();
            int byteSize = byteData.length;
 
            for (int i = 0; i < byteSize; i++) {
                stringBuffer.append(Integer.toString((byteData[i] & 0xff+ 0x100 , 16).substring(1));
            }
            shaString = stringBuffer.toString();
        }
 
        catch (Exception e) {
            e.printStackTrace();
            shaString = null;
        }
        return shaString;
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

회원가입페이지

위의 그림은 회원가입 페이지이다. 아이디는 :al, 비밀번호는 123으로 설정하였다. 콘솔창에서 hash된 값을 보았다.

회원가입 Service 부분

위의 그림에서 console창에서 비밀번호 123이 SHA 256 알고리즘을 통해 해시된값을 볼수 있다. 이제 저 값이 제대로 해시 되었는지 비교해볼 필요가 있다. http://www.convertstring.com/ko/Hash/SHA256 이곳은 SHA 256알고리즘을 통해 해시된값을 볼 수 있는 사이트이다.

사이트에서 SHA256을 사용하여 변경된 결과값 

위의 콘솔창에서 출력되는 결과값이 작아 보이지 않을수도 있지만 비교하였을때 같은 값이 나오는것을 알수있다. 이를 통해 해시가 제대로 작동하고 있다는 것을 알 수 있다. 로그인 부분또한 이와 마찬가지로 사용자가 입력한 id& password 값을 받아 password는 해시를 통해 데이터베이스에 접근하여 맞는지 비교하고 맞는것이 존재하면 회원로그인 상태로 넘어가면된다.

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
쿠키(Cookie)와 세션(Session)  (0) 2019.07.08
Docker  (0) 2019.06.27
Spring 시작하기  (0) 2019.06.25

로그인 기능까지 구현 완료 후 로그인 한 사용자의 정보를 어떠한 방법으로 다룰지에 대해 공부하다 Session이 필요하다는것을 알게 되었다.

Session은 대학교에서 Cookie와 같이 다룬것이 기억이 나는데 이것의 정확한 의미, 프로세스, 차이점을 정확하게 모르고있었다. 

이번기회에 이러한것들을 한번 정리하는것이 좋다고 생각하여 이렇게 게시글을 작성하게 되었다.

 

Cookie와 Session을 왜 사용하는가?

이 질문의 답은 간단하게 설명할 수 있다. HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용된다.

HTTP 프로토콜의 특징

1. 비연결지향(Connectionless)  

HTTP는 먼저 클라이언트가 request를 서버에 보내면 서버는 클라이언트에게 요청에 맞는 response를 보내고 접속을 끊는 특성

2. 상태정보유지안함(Stateless)

연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태정보는 유지하지 않는 특성

 

쿠키(Cookie)

쿠키는 클라이언트 로컬에 저장되는 키와 값이 들어오는 작은 데이터 파일을 의미한다.

쿠키의 구성요소로는 이름, 값, 말료날짜, 경로정보가 포함되어있다. 또한 쿠키는 일정시간동안 데이터를 저장할 수 있다.

 

프로세스 

1. 브루우저에서 웹페이지 접속

2. 클라이언트가 요청한 웹 페이지를 받으면서 쿠키를 클라이언트 로컬에 저장

3. 클라이언트가 재 요청시 웹페이지 요청과 함께 쿠키값도 같이 전송

이러한 프로세스의 결과적으로 우리가 웹을 사용할 때 지속적으로 로그인정보를  가지고 있는것처럼 사용하고 있다.

 

 

세션(Session)

일정시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술이다. 

클라이언트가 request를 보내면 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는데 이것이 Session ID이다. 

 

프로세스

1. 클라이언트가 서버에 접속시 세션 ID를 발급

2. 서버에서는 클라이언트로 발급해준 세션 ID를 쿠키를 사용해 저장 (이때 쿠키를 JSESSIONID이라고 말함)

3. 클라이언트는 다시 접속할 때 이 쿠키를 이용해 서버에 전달

 

 

Cookie와 Session의 차이점

  Cookie(쿠키) Session(세션)
저장위치 클라이언트에 파일로 저장 서버에 저장
라이프 사이클  만료시간 존재 하지만 브라우저 종료시 정보가 계속 남아있을 수 있다.  브라우저 종료시 만료시간에 상관없이 무조건 소멸된다.
속도 속도가 빠르다 속도가 비교적 느리다
보안 request에서 스나이핑 가능 보안성 비교적 좋음

 

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
해시(Hash) 와 암호화(Encryption)  (0) 2019.07.08
Docker  (0) 2019.06.27
Spring 시작하기  (0) 2019.06.25

Docker

Docker란?

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

여기에서 새롭게 등장하는 언어가 존재하는데 바로 '컨테이너'이다.

우리가 일반적으로 '컨테이너'라는 단어를 생각하면 화물을 수송할 때 규격화되어 배, 트레일러 등과 같은 다양한 운송수단으로 옮길 수 있는 대상이라고 생각할 수 있다.

서버에서 이야기하는 컨테이너도 비슷한 개념인데 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

가상화를 하는 방법으로는 기존에 있던 VM이 있는데 VM과 비교하여 Docker의 이점은 무엇인가?

VM과 Docker의 차이

가장 큰 장점으로는 사이즈가 작고 이를 토대로 속도가 VM보다 빠르다는 이점이 존재한다.

위의 그림을 보면 VM에서는 Hypervisor(호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼)가 Hardware를 가상화하고 그 위에 Guest OS가 올라가게 된다. 반면 Docker를 보면 Docker-engine위에 Application 실행에 필요한 바이너리만 올라간다. 그외의 커널 부분은 호스트의 커널을 공유한다. 이밖에도 배포부분을 생각하면 VM으로 배포를 한다고 하면 너무 무겁고 느려 운영환경에서 사용할 수 없다는 단점을 가지고  Docker는 이미지를 사용하여 사이즈가 작다는 장점을 가지면서 Docker가 현재 많이 사용된다.

 

Docker Command

Command Description
docker pull mysql mysql 설치
docker ps / docker ps -a 실행중인 컨테이너 출력 / 컨테이너 전체 출력
docker stop mysql 현재 실행중인 mysql을 중지
docker rm mysql / docker rmi mysql mysql제거 / mysql 이미지 제거
docker images 현재 이미지 확인
docker rmi -f mysql (강제) 컨테이너 삭제전 이미지 삭제하는 경우

 

Mysql설치

1. docker -d -p portNumber:portNumber -e MYSQL_ROOT_PASSWORD=password설정 --name 사용자 지정 이름 mysql

2. docker exec -i -t mysql bash (실행)

3. mysql -u root -p

4.설정한 비밀번호 입력 완료하면 데이터베이스 접근 완료

 

이미 받은 Mysql 이미지 삭제
설치 하는 전 과정

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
해시(Hash) 와 암호화(Encryption)  (0) 2019.07.08
쿠키(Cookie)와 세션(Session)  (0) 2019.07.08
Spring 시작하기  (0) 2019.06.25

1. Library 와 Framework의 차이점

Library

라이브러리는 함수들의 집합이다. 프로그램을 만들 때 기존에 만들어진 함수들을 다시 재활용함으로 프로그램의 제작 기간과 프로그래머의 노력을 줄일 수 있다. Framework와 비교했을 때 각각의 함수들은 독립적으로 작동하기 때문에 필요한 함수만 호출하여 쓸 수 있다.

Framework

프레임워크 역시 함수들의 집합이지만 단순히 함수들을 모아 놓는 것이 아니라 특정한 프로그램 제작에 필요할 함수들을 모두 포함하고 있으며 프레임워크를 사용한다는 것은 프레임워크가 제시하는 방식으로 개발한다는 뜻을 의미한다. 결론적으로는 해당 틀(Frame)안에서 내 프로그램을 만드는 것이다.

프레임워크의 장점으로는 개발시간을 줄일 수 있고 또한 오류로부터 자유로울 수 있다.

 

2. 스프링 프레임워크 이해하기

웹 애플리케이션 개발을 위해 다양한 프레임워크가 존재하는데 이중에서 가장 많이 사용되고 있는 프레임워크중 하나는 스프링 MVC 프레임워크이다. 스프링 프레임 워크는 일반적인 사용자를 위한 웹 애플리케이션부터 기업 환경의 애플리케이션까지 다양한 범위에서 사용되는 프레임워크이다.

M(Model)V(View)C(Controller) 패턴

Model: 애플리케이션의 정보, 즉 데이터를 의미한다.

View: 사용자 인터페이스, 즉 사용자가 보고 사용하는 화면등을 의미

Controller: Model과 View의 중계 역활을 한다. 사용자의 요청을 파악하고 그에 맞는 결과를 사용자에게 돌려준다.

 

일반적으로 사용하는 스프링 MVC 구조

View: 사용자가 보는 화면 또는 결과를 의미한다.

Controller: 사용자가 웹브라우저를 통해서 어떠한 요청을 하면 그 요청을 처리할 컨트롤러를 호출하게 된다. 컨트롤러는 사용자의 요청을 처리하기 위한 비즈니스 로직을 호출하고 그 결과값을 사용자에게 전달해 주는 역할을 한다.

Service: 사용자의 요청을 처리하기 위한 비즈니스 로직이 수행된다. 일반적으로 서비스영역은 서비스 인터페이스와 인터페이스의 구현체로 나뉜다.

DAO: Data Access Object의 약자로 데이터베이스에 접속해서 비즈니스 로직 실행에 필요한 Query를 호출한다.

DB: DataBase

 

SpringBoot 시작하기 中 출판사: 인사이트

 

3.  REST API란?

Rest란 Representational State Transfer의 약자로 잘 표현된 HTTP URI로 리소스를 정의하고 HTTP 메서드로 리소스에 대한 행위를 정의한다. 리소스는 JSON, XML과 같은 여러 가지 언어로 표현될 수 있다.

 

REST API의 URI를 설계할 때 지켜야하는 일반적인 규칙

1. URI는 명사를 사용한다.

2. 슬래시(/)로 계층관계를 나타낸다.

3. URI의 마지막에는 슬래시를 사용하지 않는다.

4. URI는 소문자로만 작성가능하다.

5. 가독성을 높이기 위해 하이픈(-)은 사용할 수 있지만 밑줄(_)은 사용하지 않는다.

HTTP Method

HTTP Method Meaning Role
POST Create 리소스를 생성한다.
GET Read 해당 URI 리소스를 조회한다.
PUT Update 해당 URI의 리소스를 수정한다.
Delete Delete 해당 URI의 리소스를 삭제한다.

 

이번주에 다룬 Annotation

@Component

@Controller,@Service,@Repository는  @Component를 위의 3가지로 구체화 한 것이다.

@AutoWired

org.springframework.beans.factory.annotation.Autowired

Type에 따라 알아서 Bean을 주입한다.

필드, 생성자, 입력 파라미터가 여러 개인 메서드에 적용가능 

@Entity

실제 DB의 테이블과 매칭될 클래스임을 명시한다.

즉, 테이블과 링크될 클래스임을 나타냅니다.

@Id

해당 테이블의 PK 필드를 나타낸다.

@GeneratedValue

PK의 생성 규칙을 나타낸다.

@GenerateValue(strategy=GenerationType.AUTO);

@RestController

@Controller +@ResponseBody

@Controller와 @ResponseBody의 차이점

@Controller

API view 동시에 사용하는 경우에 사용

대신 API 서비스로 사용하는 경우는 @ResponseBody 사용하여 객체를 반환한다.

view(화면) return 주목적 

@RestController

view 필요없는 API 지원하는 서비스에서 사용 (Spring 4.0.1부터 제공)

@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.

 data(json, xml 등) return이 주목적

 

 

**Annotation 부분 출처

https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html

 

[Spring] Spring Annotation의 종류와 그 역할 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

'SpringBoot' 카테고리의 다른 글

Spring으로 만드는 간단한 게시판(1)  (0) 2019.07.22
Get & Post  (0) 2019.07.08
해시(Hash) 와 암호화(Encryption)  (0) 2019.07.08
쿠키(Cookie)와 세션(Session)  (0) 2019.07.08
Docker  (0) 2019.06.27

+ Recent posts