콘솔 상에서 비밀번호 처리하기
이번 시간에는 java로 프로그램을 작성하면서 비밀번호를 입력받고 이를 처리하는 로직을 구성할 때 사용자가 입력하는 비밀번호가 보이지 않도록 처리하는 방법에 대해서 알아보도록 하겠습니다. 이러한 주제는 다음과 같은 질문에서 시작 됩니다.
다른 앱이나 웹 서비스처럼 Console 창에서도 사용자가 입력하는 비밀번호가 보이지 않도록 처리하는 방법이 없을까?
지금 우리가 구현하려는 것을 가리켜 "Password Masking" 이라고 표현합니다. 말 그대로 사용자가 입력하는 내용을 내부적으로는 유지하되, 외부적으로(console) 상에는 노출시키지 않음으로서 보안에 대한 안전성을 높이려고 하는 것 입니다.
그래서 가장 먼저 생각해볼 수 있는 내용은 다음과 같습니다.
Scanner에 masking을 지원하는 옵션이 존재하지 않을까?
우리가 일반적으로 java에서 사용로부터 값을 입력받고 이를 처리하는 로직을 구성할 때 Scanner를 사용하는 것이 일반적인데 만약 java의 Scanner가 이러한 masking과 관련된 옵션을 지원한다면 우리가 위에서 고민하던 문제가 아주 쉽게 해결됩니다.
하지만 아쉽게도 Scanner를 사용해서 masking을 수행하는 방법은 존재하지 않습니다. 그래서 실제로 console 상에서 이러한 masking을 위한 솔루션은 masking 처리하려는 값에 대해서 Scanner가 아닌 Console class를 사용하는 것입니다. 아래의 코드는 다음과 같습니다.
import java.io.Console;
public class PasswordMasking {
public static void main(String[] args) {
Console console = System.console();
char[] passwordArray = console.readPassword("Enter your password: ");
console.printf("Password is: %s%n", new String(passwordArray));
}
}
Console Class에는 readPassword 라는 method가 존재하는 데 해당 method를 사용하면 사용자가 입력하는 값에 대해서는 console 상에 노출시키지 않고, 내부적으로만 해당 값을 처리하도록 구성할 수 있습니다. 해당 코드를 실행하면 다음과 같이 사용자가 입력하는 비밀번호가 console 상에서 드러나지 않고 내부적으로는 그 값을 입력받아 관련 로직들이 처리되는 것을 확인할 수 있습니다.
하지만 이 방식의 경우 치명적인 단점이 존재합니다. 해당 솔루션은 오직 System Console에 대해서만 정상적으로 동작한다는 것입니다. 실제로 제가 사용하는 Mac의 경우 터미널을 실행하여 해당 코드를 실행하면 정상적으로 동작하지만 이를 Eclipse 환경에서 실행하면 다음과 같이 동작하지 않습니다.
실제로 위와 같이 완전히 동일한 코드를 Eclipse 상에서 컴파일하고 실행해보면 NPE가 발생합니다. 그 이유는 다음 코드에서 발생합니다.
Console console = System.console();
위의 코드에서 System.console() 은 console이 감지되지 않는 경우 null 값을 반환하게 됩니다. 그리고 Eclipse와 같이 우리가 일반적으로 사용하는 IDE들은 여기서 말하는 Console을 사용하지 않습니다. 그래서 위의 코드를 Eclipse에서 실행하게되면 null값이 return 되면서 위와 같이 NPE가 발생했던 것입니다.
Stackoverflow에서도 이와 관련된 이슈에 대한 논의가 있었습니다. 해당 링크를 참조하시면 도움이 될 것 입니다.
https://stackoverflow.com/questions/14439226/console-input-error-java-lang-nullpointerexception
따라서 Java를 사용해서 Console 상에서 masking을 수행하는 방법에 대한 내용을 정리해보면 다음과 같습니다.
1. Scanner가 아닌 java.io의 Console Class가 가지는 readPassword() method를 사용한다.
2. 하지만 이는 Console 상에서만 동작하고 일반적인 IDE가 가지는 자체적인 console에서는 사용할 수 없다.
일반적으로 우리가 많이 사용하는 IDE 들에서는 masking을 수행할 수 없다는 결론이 나왔다는 점이 썩 만족스럽지 않은 것 같습니다.
꼭 이렇게 입력하는 내용들이 완전히 출력되지 않도록 하는 masking 아니라 ' * '와 같은 문자로 출력되도록 처리하는 방법이 존재하는 지 추가적으로 더 공부해보고 적절한 솔루션을 발견하면 공유하도록 하겠습니다. 감사합니다.
'Web Backend > Java' 카테고리의 다른 글
Collection Framework 이란? (0) | 2022.03.26 |
---|---|
gson 라이브러리를 사용한 파일 입출력 기능 구현하기 (0) | 2021.07.19 |
JVM의 메모리 구조 (0) | 2021.07.03 |
Variable 과 Method (0) | 2021.06.29 |
Class와 Object (0) | 2021.06.29 |
댓글
이 글 공유하기
다른 글
-
Collection Framework 이란?
Collection Framework 이란?
2022.03.26 -
gson 라이브러리를 사용한 파일 입출력 기능 구현하기
gson 라이브러리를 사용한 파일 입출력 기능 구현하기
2021.07.19 -
JVM의 메모리 구조
JVM의 메모리 구조
2021.07.03 -
Variable 과 Method
Variable 과 Method
2021.06.29