Notice
Recent Posts
Recent Comments
Link
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

helloworld

jwt를 위한 강제 로그인 본문

jwt

jwt를 위한 강제 로그인

hellojava 2023. 10. 20. 13:25

UsernamePasswordAuthenticationFilter 를 상속받은 JwtAuthenticationFilter 클래스에서 attemptAuthentication과 successfulAuthentication을 overried 하였다. 

 

attemptAuthentication 여기에서는 username과 password를 받아서 파싱을 한 후 UsernamePasswordAuthenticationToken 에 집어넣는다. 

 

그 후에는 PrincipalDetailsService 의 loadUserByUsername()함수가 실행되고, 정상이면 (db에 있는 username과 password가 일치하면) authentication이 리턴된다.

 

그 후 authentication을 PrincipalDetails에 다운캐스팅하여 넣고 로그에 찍어보면 로그인이 됐는지 확인 할 수 있다.

 

authentication 객체를 session 영역에 저장해야하고 그 방법이 return 해주는 것이다.

리턴의 이유는 권한관리를 springsecurity가 대신 해주기때문에 편하게 하려고 하는것이다.

굳이 jwt토큰을 사용하면서 세션을 만들 이유는 없지만 권한처리를 위해 session영역에 넣어주는 것이다.

 

@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
System.out.println("JwtAuthenticationFilter : 로그인 시도중");
//1. username, password 받아서
try {
// BufferedReader br = request.getReader();
// String input = null;
// while((input = br.readLine()) != null)
// System.out.println(input);
// System.out.println(request.getInputStream().toString());

ObjectMapper om = new ObjectMapper(); //json 데이터 파싱
Users users = om.readValue(request.getInputStream(), Users.class);
System.out.println("users = " + users);

UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(users.getUsername(), users.getPassword());

//PrincipalDetailsService loadUserByUsername() 함수가 실행된 후 정상이면 authentication이 리턴됨
// db에 있는 username password 가 일치
Authentication authentication = authenticationManager.authenticate(authenticationToken);



PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
System.out.println("principalDetails : " + principalDetails.getUsers().getUsername());//로그인 완료

// authentication 객체가 session 영역에 저장해야하고 그 방법이 return 해주면 됨
// 리턴의 이유는 권한 관리를 security가 대신 해주기 때문에 편하려고 하는거임.
// 굳이 jwt 토큰을 사용하면서 세션을 만들 이유는 없음. 근데 단지 권한처리때매 session을 넣어줌


return authentication;

}
catch (IOException e) {
throw new RuntimeException(e);
}



}

//로그창

users = Users(id=0, username=ssar, password=1234, roles=null)
PrincipalDetailsService의 loadUserByUsername()
Hibernate: select users0_.id as id1_0_, users0_.password as password2_0_, users0_.roles as roles3_0_, users0_.username as username4_0_ from Users users0_ where users0_.username=?
principalDetails : ssar

//

아직 너무너무 어렵다 ㅠ

 

successfulAuthentication는 위의 함수에서 인증이 정상적으로 되었으면 실행되는 함수이다.

jwt토큰을 만들어서 request 요청한 사용자에게 jwt토큰을 response해주는 함수를 만들ㅇ ㅖ정이다.

'jwt' 카테고리의 다른 글

jwt토큰 만들어서 응답해주기  (0) 2023.10.20
jwt 임시 토큰 만들어보기  (2) 2023.10.19
JWT 를 위한 Security 설정  (0) 2023.10.19
JWT 구조 이해  (2) 2023.10.18
RFC 문서  (0) 2023.10.18