-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[REFACTOR] 로그인 정보를 쿠키 -> HTTP Authorization 헤더 로 변경한다. #908
Comments
진행 방식기존의 Cookie 방식을 유지한 채로 Authorization 헤더를 확인하는 로직을 추가한다. 프론트엔드, 익스텐션 코드를 Authorization 방식으로 변경한다. 백엔드 코드에서 Cookie 방식을 제거한다. |
Cookie와 Authorization에 같은 credential 값을 사용할 수 없는 문제
위 때문에 똑같은 +) Base64 인코딩이 모든 상황에서 필요한 것이 아닙니다.
하지만, 현재 credential 값을 설정하는 이에 |
고민 사항인증 값의 상수화Cookie / 헤더의 값을 수동으로 다음 요청에 넣어주기 위해선 쿠키 / 헤더의 이름이 필요하다. 다만, 이 값이 캡슐화 해야 하는 값인지에 의견이 분분한 상황이다. |
1. 전략 패턴 기반 설계a. 공통 인터페이스 정의
public interface LoginService {
boolean supports(String authorizationType); // 특정 인증 타입 지원 여부
String login(String authorizationHeader); // 로그인 처리 로직
} b. 각 인증 방식에 맞는 구현체 작성Basic 인증 서비스: import org.springframework.stereotype.Service;
import java.util.Base64;
@Service
public class BasicLoginService implements LoginService {
@Override
public boolean supports(String authorizationType) {
return authorizationType.equalsIgnoreCase("Basic");
}
@Override
public String login(String authorizationHeader) {
String base64Credentials = authorizationHeader.substring("Basic ".length());
String credentials = new String(Base64.getDecoder().decode(base64Credentials));
String[] values = credentials.split(":", 2);
String username = values[0];
String password = values[1];
if ("user".equals(username) && "password".equals(password)) {
return "Basic authentication successful for user: " + username;
}
return "Invalid Basic authentication credentials";
}
} Bearer 인증 서비스: import org.springframework.stereotype.Service;
@Service
public class BearerLoginService implements LoginService {
@Override
public boolean supports(String authorizationType) {
return authorizationType.equalsIgnoreCase("Bearer");
}
@Override
public String login(String authorizationHeader) {
String token = authorizationHeader.substring("Bearer ".length());
if ("valid-token".equals(token)) {
return "Bearer authentication successful for token: " + token;
}
return "Invalid Bearer token";
}
} c. 서비스 레지스트리 작성
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class LoginServiceRegistry {
private final List<LoginService> loginServices;
public LoginServiceRegistry(List<LoginService> loginServices) {
this.loginServices = loginServices;
}
public LoginService getService(String authorizationType) {
return loginServices.stream()
.filter(service -> service.supports(authorizationType))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unsupported Authorization type: " + authorizationType));
}
} d. 컨트롤러 리팩토링
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/auth")
public class LoginController {
private final LoginServiceRegistry loginServiceRegistry;
public LoginController(LoginServiceRegistry loginServiceRegistry) {
this.loginServiceRegistry = loginServiceRegistry;
}
@PostMapping("/login")
public String login(@RequestHeader("Authorization") String authorizationHeader) {
String authorizationType = authorizationHeader.split(" ")[0];
LoginService loginService = loginServiceRegistry.getService(authorizationType);
return loginService.login(authorizationHeader);
}
} 2. 확장 시의 이점
3. 추가 인증 방식 예제Custom 인증 서비스import org.springframework.stereotype.Service;
@Service
public class CustomLoginService implements LoginService {
@Override
public boolean supports(String authorizationType) {
return authorizationType.equalsIgnoreCase("Custom");
}
@Override
public String login(String authorizationHeader) {
String customToken = authorizationHeader.substring("Custom ".length());
if ("valid-custom-token".equals(customToken)) {
return "Custom authentication successful for token: " + customToken;
}
return "Invalid Custom token";
}
} 이 새로운 인증 서비스를 추가해도 컨트롤러나 레지스트리를 변경할 필요가 없습니다. 4. 결과요청 예시
5. 요약
이 설계는 유지보수성, 확장성, 코드 가독성 측면에서 훌륭한 접근 방식입니다. |
제우스의 제안에 대한 변경 여부는 인증 타입에 대한 확장성을 고려해야 하는 OAuth 도입 작업에서 고민하기로 결정 및 전달 하였습니다. |
📌 어떤 기능을 리팩터링 하나요?
쿠키의 동작은 브라우저 정책에 의존한다.
항상 동일하게 동작할 수 있도록 HTTP Authorization 헤더로 변경한다.
The text was updated successfully, but these errors were encountered: