Java
Spring Security + MySQL 사용시 로그인 대소문자 구분 주의사항
멋진그이름
2019. 9. 11. 11:21
<현상>
- 우연히 내부 개발서버 테스트중 발견함
- "ParkUser1" 이라는 사용자가 DB에 있는데 로그인API를 "parkuser1"로 해도 로그인이 됨!
<이유>
- 기존에 많은 블로그에서 포스팅된 것처럼 MySQL이 대소문자가 다음과 같이 구분한다.
VARCHAR : 대소문자 구분 안함
VARBINARY : 대소문자 구분 함
BINARY() 함수 : 대소문자를 구분하여 WHERE 이하 절 연산
<해결방법>
1. WHERE 절에 BINARY() 함수를 사용하여 조건을 검색하면 대소문자 구분이 됩니다.
2. VARBINARY타입으로 테이블 생성
<아키텍처 보완을 위한 추가사항>
- 이번 개발계는 Spring JPA로 진행하면서 테이블이 자동생성 되었고 이때 타입이 VARCHAR로 기본생성되어 발생된 문제였다.
- 클라우드를 사용하면서 대부분의 환경을 자동화하려고 한다.
- 또한 JPA가 지향하는 바 Database 디펜던시를 낮추고 대부분의 로직은 어플리케이션으로 처리한다.
- 확장에 열려있고 변경에는 닫혀있는 디자인 원칙을 적용하는 것은, 설계레벨 뿐만 아니라 아키텍처 레벨에서도 적용되어야 한다. (OCP)
UserDetailsService에 다음과 같은 로직을 추가하였다.
테스트 결과 MySQL을 사용할 때 Column Type을 VARCHAR로 사용해도 문제가 없었다.