스택오버플로우에서 본 q&a를 정리해봤다.
질의 요지는 다음과 같다
옛날부터 기본적으로 비밀번호의 저장은 char[]로 배운다.
하지만 Atlassian Jira's Java API나 Thales' Luna Java API는 string를 사용한다.
이제는 string이나 char[]이나 상관없는 것인가?
답변은 다음과 같다.
결론적으로 여전히 char[]를 보안적으로 권장, 하지만 string도 큰 문제는 없다(?)
비밀번호를 처리하는 서비스는 당연하게 비밀번호 변경 기능을 포함하고 있어야 한다.
그렇다면 string을 채용한 비밀번호 서비스는 비밀번호 변경시 string 특성상 기존 객체를 수정 할 수 없기 때문에 새로운 string 객체를 생성해 처리한다. 여기서 발생하는 문제는 기존 비밀번호가 담긴 메모리다.
앞서 우리는 자바의 메모리 할당 처리에 대한 약간의 이해가 필요하다.
자바는 쓸모없어진 메모리를 즉각적으로 초기화 해주지 않는다. 단지 필요없어진 것을 확인하면 표시만 해둔다
이 표시는 시스템적으로 사용 가능한(비워져있는) 메모리인 것으로 판단되게 한다.
또한 자바는 추후 일정 시간마다 garbage collection 통해서 메모리를 청소해준다.
즉 자바는 즉각적으로 메모리가 초기화 되지않는다는 것이다.
다시 본론으로 돌아와서 비밀번호 변경을 위해서 생성한 string은 기존 메모리 위에 덮어쓰는 것이 아니고 기존 string의 메모리는 필요없어진 것이라 표시 후 비워져있는 다른 메모리에 새 string이 할당되는 것이다.
그렇다면 이 과정 후 garbage collection이 처리하기 전까지 기존 string 메모리는 실질적인 정보가 담겨져 있음에도 방치가 된다.
이것의 string의 보안 문제이다.
char[]의 경우 비밀번호 변경을 하더라도 기존 메모리에서 덮어써지는 방식임으로 방치되지 않는다.
하지만 위 질문처럼 왜 몇 api는 string을 사용할까?
사실 서버의 메모리에 접근하는 건 쉽지 않기 때문에 그냥 stirng을 사용하는 것이다.
결론이 좀 허무하긴 한데 더 자세한 내용은 링크를 살펴보자!
출처: 스택오버플로우
In Java, is there still a point in using char[] instead of String to store passwords?
I learned about using char[] to store passwords back in the Usenet days in comp.lang.java.*. Searching Stack Overflow, you can also easily find highly upvoted questions like this: Why is char[] pre...
stackoverflow.com
'Development studies > java' 카테고리의 다른 글
[JAVA] 삼항연산자와 final 관계 질의(+downcasting) (0) | 2022.10.07 |
---|