본문 바로가기
관리자

Programming-[Backend]

(404)
[TIL] mockStatic 개요static 클래스를 테스트해야할 경우가 발생했다. 아래와 같이 Spring의 의존성 없이 Factory 메서드로 DI를 구현할 때, Factory 자체를 mock 처리해야했다. SmsServiceFactory.get(config.getConfig()).send(normalizeMobileNumber, smsText); 이 때 SmsServiceFactory의 get 메서드 자체를 mock 처리하기 위해서 mockStatic을 사용했다. 기본적으로 Mockito는 인스턴스 메서드(Mock 객체)만 지원하지만, Java의 static 메서드는 인스턴스 없이 호출되므로 기본적인 @Mock이나 when()을 사용할 수 없다. 이를 해결하기 위해 Mockito 3.4+ 버전부터 mockStatic()을 제공..
[TIL] Keycloak - Google IDP Social Login시 prompt 설정 Google IDP Prompt 설정 keycloak에서 Google IDP를 설정하여 소셜 로그인을 할 때, 일부 환경(시크릿 모드 등)에서는 계정을 선택하는 화면이 나오지 않고 바로 로그인 되거나, 에러가 발생하는 경우가 발생한다. 이럴 경우 Keycloak admin console -> Identity providers -> Google -> Prompt 설정 값에 select_account 값을 넣어주면 된다. 그럼 이를 구글 요청 시 구글에서 인식하여 항상 계정 선택 화면을 띄우게 된다. 여러 개의 구글 계정을 갖고 있는 사람들이 많으므로 이런 설정을 해두는 것이 좋다.
keycloak user info endpoint 설정 user info endpoint keycloak에서 사용자의 정보가 변경되었을 때, 클라이언트가 해당 사용자 정보를 조회해서 최신 정보를 확인해야하는 경우가 있을 수 있다. 이를 위해 Keycloak은 user info endpoint를 제공한다. 이는 OIDC 표준 endpoint이기도 하다. 사용을 위해서는 특정 User가 특정 Client에 로그인하고 Access Token을 발급받은 상태여야한다. 그리고 User Info endpoint의 Authorization header에 이 토큰을 전달해줘야한다. Access Token을 발급받기 위해 client을 생성한다. 그리고 해당 client에 user info 요청이 들어왔을 때 정보를 전달해주도록 mapper 설정을 해줘야한다. Clients..
keycloak haproxy compose 내용 보호되어 있는 글입니다.
keycloak User 정보 마스킹 처리 보호되어 있는 글입니다.
keycloak 비밀번호 알고리즘 argon2, pbkdf2-sha256, 마이그레이션 필요 여부 keycloak 기본 설정keycloak 25버전 이상의 기본 비밀번호 해싱 알고리즘은 argon2로 되어있다. argon2는 2015년 알고리즘 대회에서 우승한 알고리즘이고, 기존 알고리즘들을 보완하여 나온 최신의 알고리즘이다. argon2에 대해기존 알고리즘들은 해싱이 빠르고, 그만큼 해킹할 수 있는 brute force식 공격이 편했다. 그래서 salt를 추가하고, 해싱을 반복하여 해킹 시도 한 번에 들어가는 시간이 늘어나도록 하였다. 그런데, 성능을 위해 빠른 해싱을 했다가 다시 시간이 늘어나도록 하는 것은 비효율적이고 동적이지도 못했다. 이에 따라 argon2와 같은 알고리즘은, 해싱을 시도하는 컴퓨터의 cpu, memory 등 리소스를 자동으로 탐색하고 그에 맞게 해싱 반복 횟수를 조절하여 환..
[TIL] 문자열 LIKE 검색 인덱스 MYSQL DB 컬럼 설계 시 name과 같이 사람이 알아볼 수 있는 문자열의 컬럼이 있고, 그를 검색하는 로직이 있는 경우가 흔하다. 이 때, name을 index로 잡더라도 LIKE 검색 시에는 무조건 동작하지 않는다. MYSQL에 한해, 다음과 같은 조건으로만 인덱스가 적용된다. 인덱스가 적용되지 않을 경우 full scan이 적용되어 주의해야한다. • Containing → %값% (부분 검색) → 인덱스 사용 X• StartingWith → 값% (접두어 검색) → 인덱스 사용 O• EndingWith → %값 (접미어 검색) → 인덱스 사용 X  JPA의 경우의 예시이다. 위 규칙에 따라 적용된다고 생각하면 된다. findByNameContaining("abc") WHERE name LIKE '%abc%..
.jar java SPI 모듈 개발: Factory Pattern(w/o Spring), ServiceLoader, @AutoService 배경Java용 SPI .jar 파일을 build하여 다른 프로젝트에 dependency 형태로 추가하여 사용하는 작업이 필요했다. 구체적으로는 keycloak의 provider를 .jar로 개발해야하는 상황이였다. 순수 Java로 개발하는 경우, Spring의 의존성을 최대한 지양하는 것이 좋다. 다른 프로젝트에서는 Java만을 통해 해당 .jar를 사용할 것이기 때문이다.  1. Factory Pattern기존에 Spring을 사용할 때는 dependency injection을 위해 @Autowire 등을 사용하여 한 객체에서 다른 객체의 Bean을 참고하도록 처리했다. 그러나 Spring을 사용하지 않을 때는 직접 구현체를 넣으면 될 것이다. 예시를 들자면 아래와 같다. public class Tes..