728x90

로그인할때 패스워드를 평문(PlainText)으로 서버에 보낼시 보안상 문제가 되지 않을까? 라는 질문에서 부터 시작되었다.

POST... HTTPS...를 생각하더라도 패스워드를 평문으로 다루면 안될것 같다는 막연한 상상(망상인가)... 검증도 안해보고;;

 

0. 기존에 구현한 로그인 순서

1. 클라이언트로 아이디와 비밀번호를 평문형태로 서버에 보낸다. 

2. 아이디를 기준으로 DB에서 패스워드(Bcrypt암호화)를 가져온다.

3. 가져온 DB패스워드를 클라이언트에서 받은 평문비밀번호와 아래와 같이 비교한다. ( PHP )

    if ( password_verify("클라이언트에서 받은 패스워드", "DB에서 가져온 패스워드") ) {
        echo '패스워드 일치';
    } else {
         echo '패스워드 불일치';
    }

 

4. 패스워드가 일치하면 DB에서 나머지 정보를 가져온다.


1. 클라이언트에서 API 요청시 평문으로 보내고 있는 점

 

암호화된 패스워드를 PHP로 보내고 PHP에서 복호화한 패스워드를 앞서 말한 password_verify함수로 비교하면 해결할 수 있지 않을까?

 

1-1.  Bcrypt 방식으로 데이터 베이스에 저장되어 있는 유저의 패스워드 데이터

 

sha-256과 같은 암호화 알고리즘으로 구현할때는 서버에 저장된 해시값과 단순 비교만 하면 문제없이 구현할 수 있었다.

그러나 DB에 저장된 패스워드값이 Bcrypt로 저장되어 있기 때문에 단순 비교가 안되었다. 그래서 password_verify 함수로 비교한 것이다.

"Bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤한 솔트를 생성하기 때문에 같은 문자열에 대해서 다른 인코드된 결과를 반환한다"
https://pjh3749.tistory.com/258 [JayTech의 기술 블로그]

 

2. 그럼 암호화와 복호화가 가능한 알고리즘은 어떤것이 있을까?

 

주변에 이문제에 대해 도움을 요청했고, RSA알고리즘을 사용해 보는건 어떻겠냐는 의견을 받았다.

RSA에 대해 공부한적이 없어 RSA를 구글링하기 시작했다.

 

그렇게 습득한 얕은 지식으로 개인키와 공개키를 생성할 수 있었다.

 

...

 

( 아직 이해가 부족해서 더 공부해야 된다 )

 

3. 앞으로 해야할 TODO

이제 적용하는 일이 남았다.

1. 클라이언트는 공개키를 통해 평문으로된 패스워드를 암호화한다.

 

2. 암호화된 패스워드를 서버(PHP)로 보낸다.

 

3. PHP에서 가지고 있는 개인키로 암호화된 패스워드를 복호화한다.

 

4. 이제 복호화된 패스워드를 password_verify 함수를 통해 검증하면 된다.

 

5. 검증이 완료되면 나머지 유저의 정보를 반환 한다.

 

 

 

4. 마무리

여기 까지가 내가 생각한 패스워드를 안전하게 전달해서 로그인하는 방법이다.

내가 생각한 방법이 문제가 되거나, 현업에서 쓰이는 보편화된 래퍼런스가 있는지 찾아봐야 겠다. 

 

이 포스팅을 보는 분들중 아시는분이 있다면 댓글을 달아 주시면 참 고마울 것 같다 ^^.

 

 

 

 

 

 

참고

www.crocus.co.kr/1203

 

RSA 암호 알고리즘

이 게시물의 내용은 https://www.youtube.com/watch?v=kGUlfVpIfaQ 위의 링크를 기반으로 제작하였습니다. 문제가 된다면 삭제조치 하겠습니다. 1. RSA 암호 알고리즘이란? Rivet, Shamir, Adelman 세사람의 첫이..

www.crocus.co.kr

https://pjh3749.tistory.com/258

 

[Spring] Bcrypt를 이용하여 비밀번호를 암호화하여 저장하는 방법 - 실제 프로젝트 적용기

암호화를 이용하여 원문을 해시화하는 간단한 방법을 찾던 중 Devglan 사이트에서 괜찮은 칼럼을 찾았다. https://www.devglan.com/spring-mvc/storing-hashed-password-database-java 다음 내용은 위 칼럼을 번역..

pjh3749.tistory.com

 

 

 

728x90

 


 

본문

카카오톡 PC버전의 로그인창을 보면

비밀번호를 4자리 이상 입력해야 로그인 버튼이 활성화 됩니다.


예제

저도 한번 따라 만들어 봤습니다 ^^;

 

초기 로그인 화면
아이디를 작성할때 키보드가 Activity View를 가리지 않게
일정 길이 미만의 패스워드 로그인버튼 비활성화
일정 길이 이상 패스워드 입력시 활성화


소스코드

EditText의 입력 텍스트가 일정길이 이상일 때 버튼을 활성화 하는 코틀린 소스입니다.

et_password.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(p0: Editable?) {
           		//텍스트를 입력 후

            }
            override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
				//텍스트 입력 전
            }
            override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
                //텍스트 입력 중
                if(et_password.length() < 4) { // 패스워드의 길이가 4미만이면
                    btn_login.isCheckable = false // 버튼 클릭할수 없게
                    btn_login.isEnabled = false // 버튼 비활성화
                } else {
                    btn_login.isCheckable = true // 버튼 클릭할수 있게
                    btn_login.isEnabled = true // 버튼 활성화
                }
            }
        })

 

 

728x90

1. 글라이드(Glide)

http://bumptech.github.io/glide/

 

Glide v4 : Fast and efficient image loading for Android

About Glide Glide is a fast and efficient image loading library for Android focused on smooth scrolling. Glide offers an easy to use API, a performant and extensible resource decoding pipeline and automatic resource pooling. Glide supports fetching, decodi

bumptech.github.io

피카소(Picasso)

https://square.github.io/picasso/

 

Picasso

Introduction Images add much-needed context and visual flair to Android applications. Picasso allows for hassle-free image loading in your application—often in one line of code! Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView); Many c

square.github.io

 

프레스코(Fresco)

피카소

 

어느 것이 가장 좋은가요?

당신은이 질문에 대한 답이“그것에 달려 있습니다.” 각 라이브러리에는 장단점이 있으며 특정 시나리오에 가장 적합합니다.

  • 피카소의 라이브러리 크기는 다른 라이브러리보다 작지만 처음 이미지를로드하는 데 훨씬 오래 걸릴 수 있습니다. 가장 큰 장점은 앱 코드에서 구현하기가 매우 쉽다는 것입니다 (일반적으로 한 줄). 따라서 작은 메모리 공간이 필요하고 많은 양의 큰 이미지를 처리 ​​할 필요가없는 앱에 가장 적합합니다.
  • 글라이드의 로딩 시간이 더 빠르며 캐시에 소량의 메모리를 사용하지만 라이브러리 크기는 상당히 큽니다. 또한 구현하기도 쉽습니다. 메모리 풋 프린트가 중요하지 않거나 더 큰 이미지를 처리해야하는 경우 글라이드는 Picasso의 더 나은 대안 일 수 있습니다.
  • Fresco의 로딩 시간은 매우 빠르며 라이브러리에는 추가 기능과 옵션이 많이 있지만 코딩이 더 복잡합니다. 이 옵션은 숙련 된 개발자가 구축 한 이미지가 많은 앱에 적합합니다.
728x90

동기식과 비동기식, 블럭킹과 논블러킹

synchronous/Asynchronous, Blocking/Non-Blocking

 

대충 동기와 블럭, 비동기와 논블럭... 대충 이렇게 짝지어서 생각해 왔었다. 

그런데 뭐가 어떻게 다르고 어떤 경우에 쓰이는지 궁금했다.

글에 앞서, 호출한 함수를 Client, 호출된 함수를 Server(API) 대입하여 생각하고 글을 작성 하였음.[각주:1] 

노드와 노드 사이의 커뮤니케이션

Node에 관한 포스팅으로 가기

 

무엇(What)이 다른가? 

Client와 Server의 관심사

 

Synchronous / Asynchronous

Client의 관심사

 

Server의 작업완료를 

1. Client가 신경쓰냐? synchronous

2. Server가 신경쓰냐? Asynchronous

 

Blocking / Non-Blocking

Server의 관심사

 

Server의 작업완료 체크를

1. Client에게 바로응답 하느냐(Non-Blocking)

2. 작업이 끝나고 응답 하느냐(Blocking)

 

어떻게(How) 다른가?

Example CASE

1. Synchronous & Non-Blocking

클라이언트는 작업완료까지 대기하면서 다른 일 못함.

서버에게 작업 완료 됐는지 계속 푸시(?)함

 

이것을 폴링이라 한다.

더보기

폴링 : 폴링이란 하나의 장치가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황에서 주로 사용된다

 

Client : (옆에서 대기하면서...) 작업 끝났어요?

Server : 아직요...

Client : 작업끝났어요?

Server : 아직요...

Client : 작업끝났어요?

Server : 네 끝났어요

Client : (다른일 시작)

 

2. Asynchronous & Non-Blocking

Client는 작업완료가 안되어도 다른 작업 가능

Server가 작업완료 되면 알려줌

 

Client : 작업끝나면 알려주세요, 다른작업 하고 있을게요.

Server : Yes, Sir!

Client : ( 열심히 일하는 중... )

... If few moments later ... 

Server : Job finished. Sir!

Client : Good Job! 😍

 

3. Synchronous & Blocking

아직 필자가 케이스를 이해를 못했습니다...-_-;; 이해하면 업데이트 합니다

 

4. Asynchronous & Blocking

아직 필자가 케이스를 이해를못했습니다...-_-;; 이해하면 업데이트 합니다.

 

 

 

 

 

 

 

Reference

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

https://musma.github.io/2019/04/17/blocking-and-synchronous.html

https://private.tistory.com/24

 

 

  1. 노드(Node)와 노드의 커뮤니케이션이 더 근본적인 개념인것 같다 [본문으로]
728x90

본 포스팅은 개인적 필요에 의해 기재되었습니다.


원노트에서 서식 복사하여 그대로 기재되었으므로

보시기에 불편할 수 있습니다.

필요하신 부분이 있다면 발췌하여 자유롭게 쓰시면 됩니다.


참고 출처와 댓글은 달아주세요~





생각해야 할 부분


카카오톡 친구 목록은 283명이다.

 

보통의 경우 200명을 넘기며 사업을 하는 사람의 경우 1000명도 넘길것이다.

 

친구목록이 10만명이라고 상상해보자.

이렇게 되면 한번에 많은 데이터를 서버로 요청해야 한다.

 

유저가 어플리케이션을 사용하는 흐름 , User Flow( 이하 플로우 ) 생각해 보자.

 

  1. 어플리케이션을 설치한다.
  2. 이전에 가입하였던 아이디가 있는가?
    1. 있다. 이전사용자
      1. 만약 어플리케이션이 기존에 설치되어 있고 데이터가 존재한다면
         SharedPreFerence ( 이하 SPF )에서 친구 목록 데이터를 불러온다.
      2. 클라이언트는 이전에 친구 추가했던 db ( server ) 요청( Request )한다.
        1. 해당 아이디(userID) USER 테이블에서 검색하자( SELECT ).
        2. userID 검색되면, Friends 테이블에서 해당 userID friendsID SELECT 하자.
        3. 이렇게 나온 friendsID 클라이언트로 전달( Response )한다.
    1. 없다. 처음사용자
      1. USER테이블에 userID 추가( INSERT) 된다.
      2. regDate ( 등록일 ) 칼럼에 년월시분초 ( ms 이하 단위 생략 ) 입력된다.
        ( MySQL date 기능을 사용 or PHP에서 UTC시간을 이용 등등.. )

+@ regLocation( 등록 지역) 입력하자. 클라이언트의 Network 정보 ( IP ) 기준으로.

  1. 서버에서 Response friendsID ArrayList 담는다.
  2. 이후 친구추가가 이루어 질때
    1. ( 어플 메모리상에서 ) ArrayList 추가한다.
    2. 서버 DB 등록 한다.
    3. SPF에도 추가 등록 한다. ( 생명주기를 신경써서 작업한다. )

 

 

플로우를 정리하면

 

1. 신규 유저일 경우 -> 회원가입 -> 아이디를 DB 추가한다

-> 친구 추가를 하면 DB friends테이블에 userId, friendId 칼럼에 각각 등록한다.

userId

friendId

userA

userB

userA

userC

userB

userA

userB

userC

userC

userA

userC

userB

"userA" 친구 목록 => userB, userC

"userB" 친구목록 => userA, userC

"userC" 친구목록 => userA, userB

 2. 기존 유저일 경우

-> 로그인한 유저 아이디를 기준으로한 key값으로 SPF에서 친구목록을 가져온다.

-> SPF 데이터가 존재하지 않을경우 ( 어플리케이션 재설치등 )

Server DataBase ( RDBMS. ex: MySQL )에서 데이터를 가져온다.

-> 가져온 데이터는 SPF 저장하고 어플리케이션이 완전히 종료되고 다시 시작될 우선적으로 SPF에서 불러오도록 한다. ( ,     우선순위를 로컬로 후순위를 서버로 )


728x90

SearchView 밑줄 ( queryBackground ) 없애는법




<Layout.XML>

android:queryBackground="@null" <--- 추가



적용 전


적용 후



728x90

자바 기준으로 작성되었습니다.



String Constant Pool이란?

    1. String str1 = "TeamNova";

    2. String str2 = new String("TeamNova");



어떤차이일까? 

1번은 String Constant Pool* 을 참조한다.

2번은 새로운 객체를 생성하여 문자열을 담는다.

String Constant Pool이라는 객체가 만들어져 있고 이곳에 있는 문자조각*을 재사용한다.

-> 마치 방하나에 LEGO조각(?)이 엄청나게 많아서 이걸로 여러가지 형태를 만들수 있다고 상상해 보자.

-> 매번 새로운 LEGO를 살필요가 없을 것이다. ( 진지하게 따지지 말긔 )


문자열을 생성할때마다 새로운 객체를 매번 생성하면 메모리를 비효율적으로 사용하므로 낭비이다.

하지만 이미 만들어진 문자를 재사용 한다면? 새로 객체를 생성하지 않아도 된다. 따라서 메모리를 효율적으로 사용할 수 있다.

필자는 이것이 String Constant Pool ...이라고 이해했다.

아래는 직접 코드로 테스트한 결과이다.

public class test1 {
	
	public static void main(String[] args) {
		
	   	String str1 = "TeamNova";
        String str2 = "TeamNova";
        String str3 = new String("TeamNova");
        String str4 = new String("TeamNova");
        //str1과 str2 비교 ( 둘다 String Constant Pool에 위치함 )
        System.out.println("str1 == str2 :"+(str1==str2));
        //str1과 str3 비교 ( 각각 String Constant Pool, Java Heap 영역에 위치함 )
        System.out.println("str1 == str3 :"+(str1==str3));
        //str3과 str4 비교 ( 각각 Java Heap 영역에 위치함 ( 각각 객체 생성 ) )
        System.out.println("str3 == str4 :"+(str3==str4));
        
       /*
        * 결과 정리
        * 
        * Heap 영역으로 배정되면 각각 메모리 영역이 따로 배정됨 ( 방으로 예를 들면 각각 새로운 방 생성 )
        * 따라서 메모리 주소가 다름.
        * 
        * String Pool은 문자열을 담당하는 방을 하나 만들어 둠.
        * 그곳에 문자들을 모두 모아 두어서 메모리 주소가 같음.
        * 
        * ※ 중요 : String Constant Pool은 Heap 영역에 존재한다.
        *        이곳에 있는 문자열을 재사용한다. 리터널하게...
        *        따라서 새로운 객체를 생성하지 않아 메모리 효율이 좋다.
        * */
	}
}


※ 위 코드에서 처럼...

str1과 str2는 같은 객체이다.  

str3과 str4는 다른 객체이다. 


따라서 총 3개의 객체가 만들어 졌다.



PS. 자바에서 객체의 메모리주소를 알아내는 ( 포인터 ) 방법을 아시는 분은 댓글 남겨주시면 감사합니다...!

잘못 기술된 부분 있다면 메일(inma06@naver.com) or 댓글 남겨주세요

'컴퓨터 프로그래밍 > JAVA' 카테고리의 다른 글

[연습]게임 - 무기강화  (2) 2018.10.03
728x90

- ESP8266 펌웨어 업데이트를 하는 이유

  esp8266의 기본 펌웨어는 보드레이트가 115000으로 설정되어있지만 아두이노의 소프트웨어 시리얼의 보드레이트는 9600이기 때문에 원활한 시리얼 통신을 위해선 9600으로 설정된 펌웨어가 필요하다.


여기서 잠깐, "소프트웨어 시리얼?"

아두이노 우노는 시리얼통신을 하나만 지원한다.

Rx(0)

Tx(1)

이 통신라인은 아두이노 우노에 코드를 업로드할때 사용된다.

그러므로 소프트웨어 시리얼 라이브러리를 통해 나머지핀에서 시리얼 통신이 되게 만들어 줄 필요가 있다.


펌웨어 업데이트 방법은 아래 블로그를 참조하였다.


펌웨어 업데이트 방법 링크참조

https://m.blog.naver.com/PostView.nhn?blogId=ssplas&logNo=220813696810&proxyReferer=https%3A%2F%2Fwww.google.com%2F )


펌웨어 도중 다음 오류가 발생한 이유

아두이노 우노의 MCU* 에 이미 다른 코드가 업로드되어 있는 경우


※ 해결 방안


아두이노 IDE

파일 - 예제 - 01.Basics - Blink 업로드

Blink등의 예제를 통해 아두이노 우노 MCU*에 업로드된 코드를 초기화 해준다.



참고

https://blog.naver.com/PostView.nhn?blogId=eduino&logNo=221152914869



+ Recent posts