공부/web-server

1214 WebServer 7일차

삶은고구마 2023. 12. 14. 14:49

조회 외에 

등록,수정,삭제 시 confirm alert는 꼭 끼워넣자.

특히, 회원 삭제 시 "정말 탈퇴하시겠습니까?"  경고&알림을 해줘야함.

 

https://kotlinworld.com/329

 

리다이렉트(Redirect)와 포워드(Forward)의 차이는 무엇인가?

리다이렉트와 포워드 특정 URL 접속 시 리다이렉트 또는 포워드가 일어나게 되면 작업 중인 페이지가 전환된다. 리다이렉트와 포워드는 페이지가 전환된다는 점에서 비슷한 역할을 한다. 하지만

kotlinworld.com


목차

-패스워드 암호화

-관리자 페이지에서 회원 목록 출력

-관리자 페이지에서 회원 검색

 아이디, 이름, 이메일 별로 검색 가능하며 일부만 입력해도 해당 문자열을 포함한 결과 출력

 ex)아이디 - gom 검색 시 gom123 nongdamgom77 회원이 검색 결과로 출력

 

 

비밀번호 - SHA512 암호화 적용하기

1.단방향 (비밀번호)

1234->QW23RWR(HASH값)

한 번 암호화되면 되돌릴 수 없음. 원래 값이 무엇인지 알 수 없다.

여기서 드는 의문점

그러면 암호화한 뒤에 원래 비밀번호와 어떻게 대조하여 로그인하는것인지?

1.사용자가 로그인 할 때 입력한 비밀번호를 매번 암호화한다. 

2.이미 암호화된 비밀번호와 이번에 입력한 암호화된 비밀번호를 비교한다.

3.일치/불일치를 확인한다.

 

2.양방향 (전화번호, 주민등록번호)

1234<->3wtwtt

암호화, 복호화가 가능.

 


SHA512를 이용한 비밀번호 암호화 예제

public static String getEncryptedPassword(String password, String salt)
    {
        String encryptedPassword = null;
        //1.암호화 (hasing)
        try
        {
            MessageDigest md = MessageDigest.getInstance("SHA-512");
            //입력한 비밀번호를 byte배열로 변환한다.
            byte[] input = password.getBytes("UTF-8");
            //먹인다.
            md.update(input);
            //소화된 결과물을 확인한다.ㅋ
            byte[] output = md.digest();//이진데이터가 나옴

            //2.인코딩 (encoding) 단순 변환작업
            /**
             * 컴퓨터 분야에서 쓰이는 Base 64란.. 8비트 이진 데이터를 문자 코드에 영향을 받지 않는
             * 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념이다.
             * 영대소문자(52개)
             * 숫자(10개)
             * +, /
             */
            Base64.Encoder encoder = Base64.getEncoder();
            encryptedPassword = encoder.encodeToString(output);
        }
        catch (NoSuchAlgorithmException | UnsupportedEncodingException e)
        {
            throw new RuntimeException(e);
        }

        return encryptedPassword;
    }

 

테스트 용으로 abcd1234!를 입력하면.. 아래와 같이 암호화가 된다.

 

 

문제점이 발생하는데..

위의 두 패스워드는 각각 다른 유저들의 패스워드이다. 순서대로 

유저A

유저B 

인데, 아이디만 다를 뿐 패스워드는 같다.

암호화를 하긴 했는데 어쩐지 좀 허전한거같기도..

그 때 사용 할 수 있는게 salt다.

 

위의 코드에서 입력한 패스워드값 외에 사용자 아이디값도 받아서 salt라는 변수에 대입한 후 

비밀번호를 암호화할 때 사용한다.

사용자마다 아이디는 다르므로 당연히 유저A와 유저B의 패스워드가 같을 때 암호화 된 결과는 상이함.

 MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] input = password.getBytes("UTF-8");
//소금치기(재료:사용자 아이디)
byte[] saltInput = salt.getBytes("UTF-8");
//먹인다.
md.update(saltInput);
//소화된 결과물을 확인한다.ㅋ
byte[] output = md.digest(input);//이진데이터가 나옴

 

소금 간 한 결과 : 유저A와 유저B의 패스워드가 다르게 바뀜.

 

+

변환이 무사히 끝났다면, 비밀번호 관련  log는 주석처리하거나 제거하자.

 

 

+

webFilter로 사용자/혹은 특정그룹만 특정 웹페이지에 접근 허용할 수 있도록 필터링 할 수있음

인증:회원로그인

인가:회원/관리자

 

 

 

 

-

금일 실습과제 힌트