๐ ์ด๋ฒ ๊ธ์์๋ ์ธ์ฆ ๋ฐฉ์ ๊ฐ๋ ๊ณผ AuthenticationFilter ๊ตฌํ์ ๋ํด ๋ค๋ฃน๋๋ค.
๐ค ์ ์ ์คํ๋ง ์ํ๋ฆฌํฐ ๊ตฌํ์ ์๋์ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.
- ํ๋ก ํธ ์๋์ ๋ฐฑ์๋๊ฐ ๋๋์ด ์งํ๋๋ ํ๋ก์ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์คํ๋ง ์ํ๋ฆฌํฐ ์ค์ ์์ ๋ก๊ทธ์ธ ํ์ด์ง์ ๋ํ ์ค์ ์ ๋ฐ๋ก ํ์ง ์์
- JWT ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํจ
- ํ ํฐ ๊ด๋ฆฌ์ redis๋ฅผ ์ด์ฉํจ
๐ ์ด์ ๊ธ ๋ณด๊ธฐ
์ฒซ ๋ฒ์งธ ๊ธ๋ถํฐ ์ ๋ ํ์๋ฉด ๋ณด๋ค ์ฝ๊ฒ ์ดํดํ์ค ์ ์์ต๋๋ค!
https://suzuworld.tistory.com/438 - ๋น์ ์ ์ฒซ ํ๋ก์ ํธ๋ฅผ ์ํ ์คํ๋ง ์ํ๋ฆฌํฐ ํบ์๋ณด๊ธฐ
์ด์ ๊ธ
https://suzuworld.tistory.com/439 - SecurityConfig ๊ตฌ์ฑํ๊ธฐ
๐ ๋ชฉ์ฐจ
์คํ๋ง ์ํ๋ฆฌํฐ ํบ์๋ณด๊ธฐ
SecurityConfig ๊ตฌ์ฑํ๊ธฐ
์ธ์ฆ ๋ฐฉ์ ๊ฐ๋ ๊ณผ AuthenticationFilter (ํ์ฌ ๊ธ)
๐ค ๋ค์ด๊ฐ๊ธฐ ์ ์
- ์ง๋ ๊ธ์์๋ Spring Security๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ค์ ํด์ผ ํ Configuration์ ๋ํด ์์๋ณด์์ต๋๋ค.
- ์ด์ ๋ณธ๊ฒฉ์ ์ธ ๊ตฌํ์ ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋จผ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ ์ง ์๊ฐํด ๋ด
์๋ค.
- ๋ก๊ทธ์ธ, ๋ก๊ทธ์์์ด ๋น์ฐํ ํ์ํ๊ฒ ์ฃ ?
- ๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์ธ ์ดํ ๊ฐ ์์ฒญ์ ๋ง๋ ์ธ์ฆ ๋ฐ ๊ถํ์ ๋ํด ๊ฒ์ฌํ์ฌ ํต๊ณผ์ํค๊ฑฐ๋ ์ ๊ตฌ์ปทํ๋ ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ ๊ฒ๋๋ค.
- ์ฒซ ๊ธ๋ถํฐ ์ธ๊ธํ์ง๋ง ์ ํฌ๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๋ฐฉ๋ฒ ์ค ํ ํฐ ๊ด๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒ๋๋ค.
- ๋ฐ๋ผ์ ์ด๋ฒ ๊ธ์๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ ๊ณผ ์ ๊ทธ๋ฆผ์ 1 ~3๋ฒ์ ํด๋นํ๋ ๋ถ๋ถ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ฎ๐ปโ๏ธ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๊ด๋ฆฌ ๋ฐฉ์
- ์๋ง ๋๋ถ๋ถ ์ดํดํ๊ณ ๊ณ์๊ฒ ์ง๋ง ํน์๋ ์ดํด๋ณด๋ค๋ ๊ตฌํ์ ์์ ๋ถ๋ค์ ์ํด ์์ฃผ ๊ฐ๋จํ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋ก๊ทธ์ธ์ ํ๋ฉด ์ฌ์ฉ์๊ฐ ์๋ฒ์ ์์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ฌํ์ฌ ํด๋น ์ ๋ณด๊ฐ ์๋ฒ์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด์ ์ผ์นํจ์ ํ์ธํฉ๋๋ค.
- ๊ทธ๋ฐ๋ฐ, HTTP ํต์ ์ ๋ํ์ ์ธ ํน์ง์ด ์์ฃ ? ๋ฐ๋ก ๋ฌด์ํ์ฑ(Stateless)์
๋๋ค.
- ์ฆ, HTTP๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ด ๋ ๋ฆฝ์ ์ด๋ฉฐ ๊ฐ ์์ฒญ์ ์ด์ ์์ฒญ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
- ์ฐ๋ฆฌ๊ฐ ๋ก๊ทธ์ธ์ ํ๊ณ ๋์ ๊ฐ์ธ์ ๋ณด๊ฐ ๋ค์ด์๋ ๋ด ํ๋กํ ๋ณด๊ธฐ ์กฐํ๋ฅผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
- ์ฐ๋ฆฌ๋ ๋ก๊ทธ์ธ๋ง ํ์ ๋ฟ์ ๋๋ค. ์์ ์ ํ๋กํ ์กฐํ๋ฅผ ํ์ธํ๊ธฐ ์ํด [๋ด ํ๋กํ ๋ณด๊ธฐ] ๋ฒํผ์ ๋๋ฅธ๋ค๋ฉด ํด๋น ์์ฒญ์ ์ด์ ๋ก๊ทธ์ธ๊ณผ๋ ์ ํ ๋ฌด๊ดํ ์์ฒญ์ด ๋ฉ๋๋ค.
- ํด๋น ์์ฒญ์ ๋ค์ ๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ฃ๊ฑฐ๋ ํ์ง ์์ผ๋ฉด ์๋ฒ ์ ์ฅ์์๋ ์ด ์์ฒญ์ด ์ธ๊ฐ๋ ์์ฒญ์ธ์ง๋ฅผ ํ์ธํ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ด์ฃ .
- ๊ทธ๋ ๋ค๊ณ ๋ชจ๋ ์์ฒญ์ ๋งค๋ฒ ๋ก๊ทธ์ธ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ค๋ฉด ๋ง๋ ์ ๋๊ฒ ์ฃ ..
- ๊ทธ๋์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ฌ์ฉ์ ์ธ์ฆ์ ํ๋ค๋ ์ผ์ข ์ ์ถ์ ์ฆ(?)์ ์๋ฒ๋ก๋ถํฐ ๋ฐ๊ธ๋ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ๋ค์ ์์ฒญ์ด ์์ ๋๋ง๋ค ์๋ฒ์๊ฒ ์์ฒญ ์ ๋ณด์ ๋ฃ์ด ๋ณด๋ด๋ฉด์ ์ถ๊ฐ ์ธ์ฆ ์์ด ์ํ๋ ์์ฒญ์ ์งํํ๋ ๋ฐฉ์์ด ์ฌ์ฉ๋๋ ๊ฒ์ ๋๋ค.
๐คฏ ์ด ๋ฐฉ์์๋ ๋ํ์ ์ผ๋ก ์ธ์ , ์ฟ ํค, ํ ํฐ ๊ด๋ฆฌ ๋ฐฉ์์ด ์์ต๋๋ค.
์ธ์ (Session)
- ์๋ฒ ์ธก์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ฌด์ํ HTTP ํต์ ์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํด ์๋ฒ ์ธก์ ์ธ์ ์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฒ์์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ธ์ ID๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ดํ ์๋ฒ์ ํต์ ํ ๋ ์ด ์ธ์ ID๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ์๊ฒ ์ค ์ ๋ณด๊ฐ ์ฌ์ฉ์์ ์ ๋ณด ๋์ ์ธ์ ID์ด๋ฏ๋ก ์ ๋ณด ๋ณด์์ ๊ฐํฉ๋๋ค.
- ์๋ฒ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
์ฟ ํค(Cookie)
ํด๋ผ์ด์ธํธ ์ธก์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
์๋ฒ์์ ๋ณ๋๋ก ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก ์๋ฒ ๋ฆฌ์์ค ์ฌ์ฉ์ด ์๋์ ์ผ๋ก ์ ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์์ด ์ ๋ณด ๋ณด์์ด ์๋์ ์ผ๋ก ์ฝํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
JWT(JSON Web Token)
์๋ฒ๊ฐ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ ํฐ์ ์ํธํํ๊ณ ๋ณด๋ด๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฅผ ์ ์ฅํฉ๋๋ค.
์ดํ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ฒ์ ํต์ ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ํต์ ํ๋ฏ๋ก ์๋ฒ ๋ฆฌ์์ค ์ฌ์ฉ์ด ์ ๊ณ , ํ์ฅ์ฑ์ด ๋์ต๋๋ค.
๐๐ป๐๐ป๐๐ป๐๐ป๐๐ป๐๐ป๐๐ป๐๐ป๐๐ป
๋ณด๋ค ์์ธํ ์ฐจ์ด๋ ๊ฒ์์ ํตํด ์์๋ด ์๋ค!
โ๏ธ Member ๊ด๋ จ ์ธํ
- ๋ณธ๊ฒฉ์ ์ธ ๊ตฌํ์ ์์ Member ๊ด๋ จ ๊ธฐ๋ณธ ์ธํ ์ ํ๊ฒ ์ต๋๋ค.
- ์ฌ๋ฌ๋ถ์ด ๋ฌด์์ ๊ตฌํํ๋ ๋ถ๋ช ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ตฌํ์ด ๋ค์ด๊ฐ ํ ๋ฐ์.
- ์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ํ ๋ ์ฌ๊ธฐ์๋ ๊ด๋ จ๋ ๋ด์ฉ์ ๋งค์ฐ ๊ฐ๋ตํ๊ฒ๋ง ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ค๋ช ๋ ์๋ตํฉ๋๋ค.
bulid.gradle
// JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// H2
runtimeOnly 'com.h2database:h2'
- ๊ฐํธํ ํ ์คํธ๋ฅผ ์ํด JPA๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ง๋ ๊ธ์์ ํ๋ก์ ํธ ์์ฑ ์ h2๋ ๋ฐ๋ก ์์กด์ฑ์ ์ถ๊ฐํด ์คฌ์ต๋๋ค.
MemberRepository
public interface MemberRepository extends JpaRepository<Member, Long> {
}
- JPA์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
MemberDto
public class MemberDto {
@Getter
public static class Enroll {
private String memberId;
private String password;
private String username;
}
@Getter
public static class Login {
private String memberId;
private String password;
}
}
- ํ์ ์ ๋ณด๋ก ๊ฐ์ง ํ๋๋ ์์ด๋, ๋น๋ฐ๋ฒํธ, ํ์ ์ด๋ฆ(๋๋ค์) ์ธ ๊ฐ์ ๋๋ค.
- ํ์ ๊ฐ์ ์ ํ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ ๋ ฅ๋ฐ์์ผ ํ๋ ํ๋ ์ธ ๊ฐ๋ฅผ ๋ชจ๋ ๊ฐ์ง๋๋ค.
- ๋ก๊ทธ์ธ์ ํ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ํ์ํ๋ ๋ ๊ฐ์ ํ๋๋ฅผ ๊ฐ์ง๋๋ค.
Member
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Member {
@Id
private String memberId;
private String password;
private String username;
}
- ์ํฐํฐ ํด๋์ค์ ๋๋ค.
- ๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด @Setter๋ฅผ ์ฌ์ฉํ์์ง๋ง, ํ๋ก์ ํธ์์๋ ์ํฐํฐ์์์ ์ฌ์ฉ์ ์ง์ํด์ผ ํฉ๋๋ค.
MemberController
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@PostMapping("/members")
public ResponseEntity<?> addMember(@RequestBody MemberDto.Enroll enroll) {
Member member = new Member();
member.setMemberId(enroll.getMemberId());
member.setPassword(enroll.getPassword());
member.setUsername(enroll.getUsername());
memberRepository.save(member);
return new ResponseEntity<>(member, HttpStatus.CREATED);
}
}
- ๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ํด ์ปจํธ๋กค๋ฌ์ ์ ๋ถ ๋ชฐ์๋ฃ์์ต๋๋ค.
- DTO๋ก ๋ฐ์ ํ๋๋ฅผ ์ํฐํฐ๋ก ์ฎ๊ธฐ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ฐ๋จํ ํ์๊ฐ์ ๋ก์ง์ ๋๋ค.
h2-conole & application.yml
spring:
h2:
console:
enabled: true # H2 Console์ ์ฌ์ฉ ์ฌ๋ถ (H2 Console์ H2 Database๋ฅผ UI)
path: /h2-console # H2 Console์ ๊ฒฝ๋ก
datasource:
# H2 ์ ์ ์ ๋ณด
url: jdbc:h2:mem:security # In-Memory Mode๋ก ์ฌ์ฉํจ
username: sa # H2 ์ ์ ์ username ์ ๋ณด (์์ ์
๋ ฅ)
password: # H2 ์ ์ ์ password ์ ๋ณด (์์ ์
๋ ฅ)
driver-class-name: org.h2.Driver # Database๋ฅผ H2๋ก ์ฌ์ฉํจ์ ๋ช
์
- h2 ์ค์ ์ ๋ณด์ ๋๋ค. ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
SecurityConfig
- Spring security Config์ ์ฝ๊ฐ ๋ณ๊ฒฝ์ฌํญ์ด ์์ต๋๋ค.
// h2 ์ฌ์ฉ์ ๋ถ์ฌ์ผํจ
.headers(headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
- ํ์ฌ ํ ์คํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก h2๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- h2์ ์น ์ฝ์์ iframe์ ํตํด ํ๋ฉด์ ๊ตฌ์ฑํ๋ค๊ณ ํ๋๋ฐ์. ๋ง์ฝ iframe์ ๋ํ ๋ชจ๋ ์์ฒญ์ ํ์ฉํ๋ฉด ๋๋์ค ๊ณต๊ฒฉ, ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ์ ์ทจ์ฝํด์ง ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ ์ค์ ์ iframe์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก DENY๋ก ์ค์ ํ๊ณ ์๋ค๊ณ ํฉ๋๋ค. ์ด๋ฅผ ํ์ฉํ๋ ์ค์ ์
๋๋ค.
- ์ด ์ค์ ์ ํ์ง ์์ผ๋ฉด h2 ์น ์ฝ์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
- ์ด ์ค์ ์ ํ ์คํธ๋ฅผ ์ํ ์ค์ ์ด๋ฏ๋ก h2๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ถํ์ํ ์ค์ ์ ๋๋ค.
- ์๋๋ ๊ด๋ จ ์ค๋ช ๋งํฌ์ ๋๋ค.
https://dukcode.github.io/spring/h2-console-with-spring-security/
Spring Security์์ H2 Console ์ฌ์ฉํ๊ธฐ
Spring Security์์ H2 Console ์ฌ์ฉํ๊ธฐ
dukcode.github.io
// ์ํ๋ฆฌํฐ ์ธ์ฆ์ ํ์ง ์๋ ์์ฒญ์ ์๋ํฌ์ธํธ ์ถ๊ฐ
.requestMatchers("/login", "/enroll", "/h2-console/**").permitAll()
- ๋ํ, ๊ธฐ์กด ๋ก๊ทธ์ธ api ์๋ํฌ์ธํธ ์ธ์ ์ถ๊ฐ๋ก ํ์๊ฐ์
๊ณผ h2-console๊ณผ ๊ด๋ จ๋ ์์ฒญ๋ ์ ๋ถ ์ธ์ฆํ์ง ์๊ฒ ๋ณ๊ฒฝํฉ๋๋ค.
- ํ์๊ฐ์ ๊ณผ ๋ก๊ทธ์ธ, h2-console ๋ชจ๋ ์ธ์ฆ ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ถํ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ ํ ๊ฒ์ ๋๋ค.
ํ์ ๊ฐ์ ํ ์คํธ
- PostMan์ผ๋ก ํ ์คํธํ์ต๋๋ค.
- ํ์๊ฐ์ ์ ํ๋ ๊ณผ์ ์ ๋๋ค.
- h2์ ์ ์ํ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ ๋ณธ๊ฒฉ์ ์ธ ๊ตฌํ ์์
- ์ํคํ ์ฒ์์ ์ด๋ฒ ๊ธ์์ ๊ตฌํํ ๋ถ๋ถ๋ง ๊ฐ์ ธ์์ต๋๋ค.
- ์์ ์ค๋ช ์ด ๊ธธ์์ผ๋ ์กฐ๊ธ ์ ๋ฆฌํด ๋ด ์๋ค.
- ์ฐ๋ฆฌ๋ ์์์ ํ์๊ฐ์ ์ ์ฑ๊ณตํ์ต๋๋ค.
- ํ์ ์์ด๋๋ "aaa", ๋น๋ฐ๋ฒํธ๋ "bbb", ์ฌ์ฉ์ ์ด๋ฆ์ "๊น๊ฐ๋ฅ"์ ๋๋ค.
- ์ด์ ์ฐ๋ฆฌ๋ ๋ก๊ทธ์ธ์ ๊ตฌํํด ๋ณผ ๊ฒ๋๋ค.
- ์ดํ๋ ์ด ๊ธ์์ ๋ค๋ฃฐ ๊ตฌํ ๋ถ๋ถ์
๋๋ค.
- Http Request๋ก ์ฌ์ฉ์์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ต๋๋ค. (1)
- ์ธ์ฆ ํํฐ๊ฐ ํด๋น ๊ฐ์ UsernamePasswordAuthenticationToken ๊ฐ์ฒด์ ์ฃ์ต๋๋ค. (2)
- ์ดํ AuthenticationManager์๊ฒ ์ธ์ฆ ์ฒ๋ฆฌ ๊ถํ์ ์์ํ์ฌ ์ดํ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋๋ก ์ง์ํฉ๋๋ค. (3)
JwtAuthenticationFilter(Http Request -> AuthenticationFilter)
- 1๋ฒ์ ํด๋นํ๋ ๋ถ๋ถ์
๋๋ค. "/login" ์๋ํฌ์ธํธ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ปจํธ๋กค๋ฌ์ ๊ฐ๊ธฐ ์ ํด๋น ํํฐ๋ฅผ ๊ฑฐ์น๊ฒ ๋ ๊ฒ์
๋๋ค.
- ํํฐ ์ ์ฉ์ ๋ค์ ๊ธ์์ ๋ค๋ฃน๋๋ค.
- ์ด ํด๋์ค๋ UsernamePasswordAuthenticationFilter์ด๋ ํํฐ๋ฅผ ์์๋ฐ๋๋ก ํ์ต๋๋ค. ๊ทธ ์ด์ ๋?
- ์คํ๋ง์ด ๋ก๊ทธ์ธ ์ฒ๋ฆฌ์ ๋ํ ํํฐ๋ฅผ ์ด๋ฏธ ์ ๋ง๋ค์ด๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฒ์๋ถํฐ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ด๋ฏธ ์ ๋ง๋ค์ด์ง ์ฝ๋๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด Spring Security๋ฅผ ์ฐ๋ ์ด์ ๋๊น์!
- ์ด๋ฆ์ผ๋ก ์ ์ ์๋ฏ์ด Username(Id)์ Password๋ก ๋ก๊ทธ์ธ ์ธ์ฆ์ ํ๋ ํํฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
- ์ฐธ๊ณ ๋ก ์ ๊ฐ ๋ง๋ entity์ username๊ณผ ์ด username์ ๋ค๋ฆ ๋๋ค. ์ํฐํฐ์ username์ ๋จ์ํ ๋๋ค์์ ์๋ฏธํ๊ณ , ์ฌ๊ธฐ์์ username์ ํ์ ์์ด๋๋ฅผ ์๋ฏธํฉ๋๋ค.
- attemptAuthentication() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด ์ค๋๋ค.
๋ก์ง ๊ตฌํ(AuthenticationFilter -> UsernamePasswordAuthenticationToken)
- ๊ทธ๋ฆผ์ 2, 3๋ฒ์ ํด๋นํ๋ ๋ถ๋ถ์ ๋๋ค.
private final AuthenticationManager authenticationManager;
- ๋จผ์ authenticationManager๋ฅผ ์์กด์ฑ ์ฃผ์ ๋ฐ์ต๋๋ค.
@SneakyThrows
- Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค. ์ด ์ด๋ ธํ ์ด์ ์ ๋ฉ์๋์ ์ฌ์ฉ๋๋ฉฐ ๋ฉ์๋ ๋ด๋ถ์์ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
ObjectMapper objectMapper = new ObjectMapper();
MemberDto.Login loginDto = objectMapper.readValue(request.getInputStream(), MemberDto.Login.class);
- ์ด๊ณณ์ ํํฐ๋จ์ด๋ฏ๋ก ์ง๊ธ๊ป ์คํ๋ง์ด ๋์ ํด์ค ์์
์ ์ง์ ํด์ผ ํฉ๋๋ค.
- ์์ฒญ์ผ๋ก ๋ค์ด์จ JSON ๋ฐ์ดํฐ๋ฅผ DTO์ ๋งคํํ์ฌ ๋ฃ์ด์ฃผ๋ ๋ฑ์ ์ญํ ์ ๋งํฉ๋๋ค.
- objectMapper๋ ์ด๋ฌํ ๋งคํ ์ญํ ์ ํด์ฃผ๋ ๊ฐ์ฒด์ ๋๋ค.
- new ํค์๋๋ก objectMapper ์ธ์คํด์ค๋ฅผ ํ๋ ์์ฑํ๊ณ request.getInputStream()๋ฅผ ํตํด ์์ฒญ ๋ฐ์ดํฐ์ ๋ค์ด์๋ json์ MemberDto์ Login์ ๋ง์ถฐ ๋งคํํ์ฌ loginDto๋ฅผ ์์ฑํฉ๋๋ค.
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginDto.getEmail(), loginDto.getPassword());
return authenticationManager.authenticate(authenticationToken);
- ๊ทธ๋ค์ loginDto์์ memberId์ password๋ฅผ ๊บผ๋ด UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ authenticationManager์๊ฒ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ๋ถํํฉ๋๋ค.(authenticationManager.authenticate(authenticationToken);)
๐ง๐ป๐ซ ์ ๋ฆฌ & ๋ค์ ๊ธ์์ ๋ค๋ฃฐ ๋ด์ฉ
- ์ฒซ ๋ฒ์งธ ๊ธ์์ AuthenticationManager๊ฐ ๋งค๋์ ์ ์ญํ ์ ๋ถ์ฌ๋ฐ์ ์ผ์ ์ฒ๋ฆฌํ๋ค๊ณ ํ์ต๋๋ค.
- ๊ทธ๋ฌ๋, AuthenticationManager๋ interface์ด๋ฏ๋ก ์ด๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๊ฐ ํ์ํฉ๋๋ค.
- ํด๋น ๊ตฌํ์ฒด๊ฐ ๋งค๋์ ์ ์ญํ ์ ๋ถ์ฌ๋ฐ์ ๊ฒ๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด(id, password)๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ์ ๋ณด์ ๋น๊ตํ๋๋ก ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ค๋๋ฅผ ๋ด๋ฆด ๊ฒ๋๋ค.
- ์ดํ ๊ฒฐ๊ด๊ฐ์ ๋ฆฌํด ๋ฐ์ ์ฑ๊ณต๊ณผ ์คํจ ์ ๊ฐ๊ฐ ์๋ต์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ๊ฒ๋๋ค.
- ์ด ๊ณผ์ ์์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ค๋ฉด JWT ํ ํฐ์ ๋ฐ๊ธํ๊ณ ์ ์ ์๊ฒ ์๋ต ๋ฉ์์ง์ ํจ๊ป ๋ณด๋ผ ๊ฒ์ ๋๋ค.
- ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๊ฐ ๋ง๋ AuthenticationFilter๋ฅผ Config์ ๋ฑ๋กํ์ฌ ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์ด ํํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํด์ผ ํฉ๋๋ค.
- AuthenticationManager์ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด Config์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ
๋คผํผ
https://dukcode.github.io/spring/h2-console-with-spring-security/