Wanna be Brilliant Full-Stack Developer
SpringBoot Checking Session! 본문
목표
세션이 만들어졌는데 도대체 세션이 어디에있는지 모른다! 세션이 어디에 있는지 찾아볼것이다
Example
1. 사용자가 /auth/signin 을 post 방식으로 요청한다!
2. 이것을 누가 낚아채냐면 SecurityConfig설정되어있는거 떄문에 시큐리티가 이 요청을 받아서 Server앞에서 먼저 보호하기 위해 낚아챈다. 낚아채고나서 PrincipalDetailsService( 타입이 UserDetailsService) 에 넘긴다!
3. PrincipalDetailsService내부에서 username이 있는지 확인한다
확인해서 있으면 없으면 두가지로 경우가 나뉘어지는데
3-1 없는 경우에는 쫓겨난다
4. 있는 경우에는 PrincipalDetailsService(UserDetailsSerive를 상속하고 implement를 하고 있으니 같은 타입이다)
5. 세션에 저장한다
Http 세션이라는 객체는 Request라는 객체로 만든다!
Session영역 안에 SecurityContextholder라는 곳에 들어간다.
Authenticatntion 객체안에 PrincipalDetailsService있다.
그래서 Authenticatntion 을 SecurityContextholder안에 넣는다.
우리가 나중에 찾을때는 Session 영역 안에 SecurityContextholder안에 Authenticatntion 객체 안에 PrincipalDetailsService를 찾아서 그 안에 UserObject를 찾는다. 굉장히 복잡하다.
이것이 너무 복잡해서 그런지 어노테이션을 만들어놨다.
@AuthenticationPrincipal
로 접근 하면 Authenticatntion 객체에 바로 접근할 수 있다!!
package com.cos.photogramstart.web;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.cos.photogramstart.config.auth.PrincipalDetails;
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String profile(@PathVariable int id) {
return "user/profile";
}
@GetMapping("/user/{id}/update") //user에 업데이트가 아니라 어떤 번호를 업데이트 할건지 해야하기때문 {id}를 건다!
public String update(@PathVariable int id,@AuthenticationPrincipal PrincipalDetails principalDetails ) {
System.out.println("세션 정보:" + principalDetails.getUser());
return "user/update";
}
}
이 코드가 잘 작동이 되면 우리가 세션에 접근 하고 싶으면 AuthenticationPrincipal PrincipalDetails principalDetails 애로 접근하면 된다.
어려운 방법도 예를 들어서만 작성할수 있는데..!
package com.cos.photogramstart.web;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.cos.photogramstart.config.auth.PrincipalDetails;
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String profile(@PathVariable int id) {
return "user/profile";
}
@GetMapping("/user/{id}/update") //user에 업데이트가 아니라 어떤 번호를 업데이트 할건지 해야하기때문 {id}를 건다!
public String update(@PathVariable int id,@AuthenticationPrincipal PrincipalDetails principalDetails ) {
// 1. 추천
System.out.println("세션 정보:" + principalDetails.getUser());
// 2.비추천
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
PrincipalDetails mPrincipalDetails = (PrincipalDetails) auth.getPrincipal();
System.out.println("직접 찾은 세션 정보 : " + mPrincipalDetails.getUser());
return "user/update";
}
}