YSHUSH

계정 및 인증관리 본문

Coding/Secure coding

계정 및 인증관리

코딩; 2022. 1. 23. 14:54

˙인증관리란?

ID와 패스워드를 이용한 지식기반의 인증관리에서 고려해야 할 인증관리 정책

패스워드 관리 정책
패스워드 설정, 변경, 재설정, 전송, 저장, 사용기간 등 안전한 패스워드 관리 정책이 수립되어야 한다.
인증시도 관리 정책
인증시도 횟수 제한, 안전한 로그아웃 기능, 다중 로그인 제한과 같은 기능을 구현하여 안전하게 인증 절차가 처리되어야 한다.

 

˙패스워드 설정

패스워드 설정 시 문자열 정책이 안전하게 적용되어 있는지 점검패스워드 설정 시 안전한 문자열이 사용되도록 입력 문자열이 제한되는지 확인하며, 이러한 제한이 서버와 클라이언트에서 동일하게 적용되는지 진단한다.

 

자바 스크립트로 사용자 측에서 패스워드를 입력받을 때 지정된 패턴의 문자열을 입력받도록 입력값 제한한다.

//비밀번호 유효성 확인
function isValidFormPassword(pw) {

	var check = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,20}$/;

    if(!check.test(pw)) {
        alert("비밀번호를 문자, 숫자, 특수문자의 조합으로 입력해주세요.");
        return false;
    }

    if(pw.length < 8 || pw.length > 20) {
        alert("비밀번호는 8 ~ 20 자리로 입력해주세요.");
        return false;
	}
  return true;
}

Validator 컴포넌트에서 서버측 패스워드 정책 적용

/**
  *패스워드 정책을 알파벳, 숫자, 특수문자를 조합하여 8글자 이상, 20글자 이하로 설정한다.
  *(?=.*[a-zA-Z])하나 이상의 알파벳을 포함한다.
  *(?=.*[0-9@#$%])하나 이상의 숫자나 특수문자를 포함한다.
  *{8,} 최소 8글자 이상이어야 한다.
*/

public boolean verify(String password) {
    String passwordPolicy = "((?=.*[a-zA-Z])(?=.*[0-9])(?=.*[@#$%]).{8,20})";
    Pattern pattern = Pattern.compile(passwordPolicy);
    Matcher matcher = pattern.matcher(password);
    return matcher.matches();
}

 

˙패스워드 이용단계 관리 정책

이용단계 패스워드는 암호화된 통신채널을 통해 전달되거나, 안전하게 일방향 암호화 알고리즘으로 암호화되어 저장한다.

전송
패스워드를 네트워크를 통해 전송하는 경우 SSL과 같은 암호화된 통신 채널을 이용하여 전송하거나, 패스워드를 암호화해서 전송한다.
저장
패스워드는 복호화 되지 않는 일방향 해쉬함수를 사용하여 암호화한 뒤 파일이나 DB에 저장한다.
SHA-2 타입(SHA-224, SHA-256, SHA-384, SHA-512)의 안전한 해쉬함수를 사용하여 암호화해야 하며, 패스워드 크랙 공격을 방어하기 위해 솔트(salt)를 입력값에 적용하여 암호화한다.

 

솔트값을 사용하지 않은 해쉬함수

import java.security.MessageDigest;
public byte[] getHash(String password)
	throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.reset();
    return input = digest.digest(password.getBytes("UTF-8"));
}

솔트값을 사용하여 해쉬문의 안전도를 강화

- 난수로 발생시킨 충분히 긴 문장을 솔트(salt)값으로 설정하여 해쉬함수의 입력값으로 추가 설정하여 해쉬문의 안전도를 강화한다.

import java.security.MessageDigest;
public byte[] getHash(String password, byte[] salt)
	throws NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.reset();
    digest.update(salt);
    return input = digest.digest(password.getBytes("UTF-8"));
}

 

˙자동 로그아웃

오랫동안 사용하지 않는 세션에 대한 자동 로그아웃이 설정되어 있는지 확인기본적으로 웹서버는 30분 동안 세션을 사용하지 않으면 자동적으로 로그아웃하도록 설정되어 있는 경우가 대부분이다.오랫동안 연결된 브라우저를 사용하지 않고 그대로 두었을 때 자동 로그아웃이 실행되는지 점검한다. 

 

자동 로그아웃 설정

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

-----------------------------------------

HttpSession session = request.getSession();
session.setMaxInactiveInterval(30*60);

 

'Coding > Secure coding' 카테고리의 다른 글

쿠키와 세션관리  (0) 2022.01.23
SQL 인젝션  (0) 2022.01.23