Web Authentication) : 웹 어플리케이션에서 사용자의 정체성을 확인, 적절한 권한 부여하는 과정http 프로토컬은 stateless 한 특성 때문에, 사용자가 요청을 보낼 때마다, 사용자 정보를 다시 전송해야 한다서버측에 저장하고 관리하는 Session Id를 제공한다Http Session은 ✅서버에서 관리 -> 사용자가 임의로 조작 불가HttpSession에 세션id를 만들어 그 값을 저장한다@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void login(LoginRequest loginRequest, HttpSession httpSession){
String id = loginRequest.getId();
String password = loginRequest.getPassword();
Optional<UserDto> optionalUser = userRepository.findByName(id);
if (optionalUser.isPresent()){
UserDto userDto = optionalUser.get();
if (userDto.getPassword().equals(password)){
// 세션에 정보 저장 -> 서버에서 관리되는 정보
httpSession.setAttribute("USER",userDto);
}else {
throw new RuntimeException("Password not match");
}
} else {
// 없는 유저
throw new RuntimeException("User not found");
}
}
}
USER라는 session id를 만들어서 httpSession에 정보를 저장하였다발급받은 Session id를 이용해서 웹 인증을 요청한다@RestController
@RequestMapping("/api/user")
public class UserApiController {
@GetMapping("/me")
public UserDto me(HttpSession httpSession){
UserDto user= (UserDto) httpSession.getAttribute("USER");
if (user != null){
return user;
}else {
return null;
}
}
}
로그인에 실패해도, Jsession은 항상 생긴다
Jsession: 웹 페이지 연결시 웹 서버에서 임의적으로 세션을 하나만든다. 이때 제공하는 Session id이다, 서블릿에서 발행한 session id이다
Http Cookie는 웹 브라우저와 웹 서버간의 상태정보를 유지하기 위한 기술이다Set-Cookie같은 헤더를 이용해 서버에서 클라이언트로 전송된다고유 id와 인증 토큰(쿠키)를 생성@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
//login logic
public String login(LoginRequest loginRequest, HttpServletResponse response){
String id = loginRequest.getId();
String password = loginRequest.getPassword();
Optional<UserDto> optionalUser = userRepository.findByName(id);
if (optionalUser.isPresent()){
UserDto userDto = optionalUser.get();
if (userDto.getPassword().equals(password)){
Cookie cookie = new Cookie("authorization-cookie",userDto.getId());
cookie.setDomain("localhost"); // naver.com, daum.net, dev.xxx.com
cookie.setPath("/");
cookie.setHttpOnly(true); // <-- 자바 스크립트로 조작 불가능
// cookie.setSecure(true); // <-- https에서만 사용되도록 설정
cookie.setMaxAge(-1); // session과 통일, 시간을 지정해줄 수 있음
response.addCookie(cookie);
}
}else {
throw new RuntimeException("User not found");
}
return null;
}
}
setCookie())서 클라이언트에게 전송@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/user")
public class UserApiController {
private final UserRepository userRepository;
@GetMapping("/me")
public UserDto me(@CookieValue(name = "authorization-cookie",required = false)
String authorizationCookie){
log.info("authorizationCookies : {}",authorizationCookie);
Optional<UserDto> optionalUserDto = userRepository.findById(authorizationCookie);
return optionalUserDto.get();
}
@CookieValue 어노테이션을 사용하였다Rest 클라이언트를 사용하는 네이티브, 즉 안드로이드 IOS쪽에서 많이 사용하는 방식
음.. 쿠키도
response header에 정보가 담겨서 가지 않았나???
- 맞다
결국 사용하는 브라우저의 request header에 모든 정보가 담겨져서 나간다