Basic Authentication이란?
사용자의 인증 정보(이메일과 비밀번호)을 인코딩하여 요청 헤더에 담아 서버로 전송하는 방식. HTTP 요청의 Authorization 헤더에 인증 정보를 포함시켜서 서버로 전송된다.
Base64 로그인의 구체적인 과정:
1. 사용자가 이메일과 비밀번호를 입력
2. 클라이언트는 "이메일:비밀번호" 형태의 문자열을 생성하고 Base64로 인코딩하여 인증 정보를 생성
3. 클라이언트는 인코딩된 인증 정보를 HTTP 요청의 Authorization 헤더에 포함시켜 서버에 요청을 보냄
4. 서버는 요청을 받으면 Authorization 헤더에서 인증 정보를 추출
5. 서버는 Base64로 디코딩하여 이메일과 비밀번호를 얻고, 인증을 처리
이메일이 1234@gmail.com, 패스워드가 1234인 사용자의 정보가 우선 클라이언트에서 인코딩되어 보내지는데, 테스트하기 위해 https://www.base64encode.org/ 을 이용해 인코딩하고 포스트맨에서 확인해보자.

1234@gmail.com:1234를 인코딩하면 MTIzNEBnbWFpbC5jb206MTIzNA== 라는 값이 나온다. 이를 Authorization 헤더에 넣어서 확인해보면,

로그인이 성공적으로 이루어짐을 확인할 수 있다.
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
//Base64로 encoding된 이메일과 비밀번호를 decoding한다.
String encodedMime = request.getHeader("Authorization");
//앞의 Basic 제거
byte[] decodedBytes = Base64.getMimeDecoder().decode(encodedMime.substring(6));
String decodedMime = new String(decodedBytes);
//email:password 형태를 분리
String email = decodedMime.split(":")[0];
String password = decodedMime.split(":")[1];
log.info("Email is: {}",email); log.info("Password is: {}",password);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
return authenticationManager.authenticate(authenticationToken);
}