본문 바로가기
Study in Bootcamp/Main Project

[Main Project] Day 6 & 7 : JWT Provider를 이용한 로그인 구현

by Bhinney 2022. 11. 16.

본 글은 프로젝트를 기록하기 위해 적은 글 입니다.

수정이 될 수 있으며, 정확하지 않을 수 있습니다.

전날 분량이 너무 적어 같이 쓰게 되었습니다.


✅ Day 6

📌 JWT Provider를 이용한 로그인 구현

  • 프리 때 구현하였던 JWT Tokenizer 가 아닌 Provider로 구현을 하였다.
  • 한 깃헙을 참조하여, Controller 부터 Service까지 직접 만들어서 구현해보았다.
  • 이번 메인 프로젝트가 끝나면 해당 정보들을 정리해서 깃헙과 블로그에 올릴 생각이다.
  • 프리 때 해당 토큰이 잘 오가지 않았던 적이 있어서 바디로도 헤더로도 둘 다 출력 할 수 있게 우선 설계하였다.
  • 참고한 깃헙 주소 : https://github.com/ParkJiwoon/practice-codes/tree/master/spring-security-jwt

로그인을 하면 왼쪽처럼 바디에도 헤더에도 토큰을 출력해보았다.
헤더로 인증 값을 보내지 않으면 조회할 수 없음
로그인이 안될 때 메세지


🚨 구현 중 발생한 문제

  • 권한 인증 문제가 발생하였다.
  • SecurityConfig에서 권한에 따라 HttpMethod로 url에 접근 할 수 없게 막을 수 있다.
  • 하지만 현재 hasRole(), hasAnyRole(), hasAuthority(), hasAnyAuthority()로 막을 수는 있는데, 인증이 되지 않는다.
  • 그래서 로그인과 회원가입을 제외하고 모두 인증된 즉, authenticated()로 해두었다.
  • 헤더로 보내면 인증은 되니까..!
  • 우선 아래에 있는 클래스를 공부해보아야 할 것 같다. 이것과 관련이 있을 것 같다는 예상이 든다.

/* 원래 하려 했던 것 */

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
	http
		.headers().frameOptions().sameOrigin()
		.and()
		.csrf().disable()
		.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
		.and()
		.formLogin().disable()
		.httpBasic().disable()
		.apply(new JwtSecurityConfig(jwtProvider))
		.and()
		.authorizeHttpRequests(authorize -> authorize
			.antMatchers(HttpMethod.GET, "/members/client/**").hasRole("CLIENT")
			.antMatchers(HttpMethod.PATCH, "/members/client/**").hasAnyRole("CLIENT")
			.anyRequest().permitAll()
		)
		.exceptionHandling()
		.authenticationEntryPoint(new MemberAuthenticationEntryPoint())
		.accessDeniedHandler(new MemberAccessDeniedHandler());

	return http.build();
}
/* 현재 구현된 코드 */

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
	http
		.headers().frameOptions().sameOrigin()
		.and()
		.csrf().disable()
		.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
		.and()
		.formLogin().disable()
		.httpBasic().disable()
		.apply(new JwtSecurityConfig(jwtProvider))
		.and()
		.authorizeHttpRequests(authorize -> authorize
			.antMatchers(HttpMethod.POST, "/members/signup").permitAll()
			.antMatchers(HttpMethod.POST, "/login").permitAll()
			.anyRequest().authenticated()
		)
		.exceptionHandling()
		.authenticationEntryPoint(new MemberAuthenticationEntryPoint())
		.accessDeniedHandler(new MemberAccessDeniedHandler());

	return http.build();
}

✅ Day 7

📌 OAuth2를 구현하기 위한 공부 및 자료를 통한 코드 작성

  • 프리 때 하지 못했던 소셜 로그인을 구현하려고 계획
  • 한 블로그의 글을 참조하면서 공부하였다.
  • 지금은 보이지 않는 클래스도 있어서 찾아가면서 쭉 보았다.
  • 세 번 정도 코드를 읽어본 후 작업을 해보았다.
  • 현재 한 30 프로 정도....
  • 참고한 자료들은 공부 후 내것으로 만들어 같이 올리려고 한다.
  • 또한 소셜로 로그인한다면 판매자와 소비자를 어떻게 저장해야할 지 고민을 해봐야 할 것 같다.

📌 판매자 테이블 변경

  • 원래는 판매자에 들어갈 이미지의 테이블을 따로 만들어서 관리하려고 계획
  • 이미지를 S3 버킷에 넣고, 경로를 주는 방법으로 구현 예정
  • 따라서 한 장의 이미지라면, 따로 테이블을 둬서 관리하기 보다는 그냥 판매자 테이블에 필드로 넣는 게 나을 것 같다고 판단

📌 회원 테이블 변경

  • 소셜 로그인을 구현하려고 하다 보니, 해당 소셜의 정보를 저장하여야 하지 않을까 하여 provider 필드 추가
  • 해당 파트는 응답 바디를 어떻게 해야할 지는 우선 소셜을 구현해 본 이후 판단해보려 한다.

🔥내일 할 일

  • 소셜 로그인 구현 
  • 소셜 로그인 시, 생산자와 소비자 나누는 방법 생각
  • 멘토링

+ 현재 눈의 피로도가 엄청 쌓였다.. 제발 제발 모니터 멀리 두고, 쉴 때는 전자기기 멀리하고...

댓글