이제는 웹 애플리케이션
로그인 작업 중에 활용할 수 있게
Spring Boot 웹 애플리케이션의 메모리에
유저를 생성할 차례입니다
여기서 확인할 수 있듯이 한 가지 방법이 있고
다른 방법이 하나 더 있는데
다음 강의에서 다루겠습니다
이 두 방법 간의 차이점은
정말 사소합니다
다음 강의까지 다 들으시면
두 가지 방법들을 다 문제없이 하실 수 있을 겁니다
들어가기 전에 짚고 넘어갈 것은
프로덕션(운영) 웹 애플리케이션에 사용은 비추천한다는 것입니다
왜냐하면 사람들이 여러분이 코딩한
아이디와 비밀번호가 무엇인지 알 수 있기 때문입니다
누군가가 GitHub에 게시된 코드 안에서
자격증명을 볼 수 있거나
컨트롤 시스템 안에서 볼 수 있다면
안전한 방법이 아닙니다
따라서 이 방법은
비프로덕션 애플리케이션에서 사용하거나
중요도가 낮은 애플리케이션이나
데모 애플리케이션에만
사용하시기 바랍니다
여기에서 볼 수 있듯이
Spring Boot 웹 애플리케이션에
다수의 유저를 생성하려면
InMemoryUserDetailsManager에
Bean을 만들어야 합니다
이 bean은 userDetailManager의
인터페이스를 확장시켜주는 역할을 합니다
InMemoryUserDetailsManager에
객체를 만드려고 할 때
이 클래스 안에
여러명의 유저를 만들 수 있게 되는 것입니다
전 리턴 문장에서 이것을 확인할 수 있습니다
새 객체를 이 클래스에 반환하기 전에
이 메소드의 위에서 만든
관리자(admin)와 유저(user) 정보를 반환하는 것입니다
여기서 질문이 하나 생길 것입니다
유저와
아이디, 비밀번호 그리고 권한을 설정하려면 어떻게 해야 합니까? 입니다
마찬가지로 Spring Security 프레임워크안에는
우리가 접근할 수 있는 User 클래스가 있습니다
User 클래스를 이용해
먼저 비밀번호를 설정하고
사용할 비밀번호를 코딩할 수 있습니다
예시에서는
간단한 텍스트 비밀번호를 사용하고 싶기 때문에
DefaultPasswordEncoder를 사용할 수 있지만
하지만 프로덕션 단계에서는 그렇게 권장할 만한 접근 방식이 아닙니다
따라서 이 접근법을 사용하면
사용 중단 경고가 뜹니다
무시하고 계속 진행하면 페스워드를 설정하고 나면
유저 이름, 비밀번호 그리고 권한이
무엇인지 말해주어야 합니다
이런 세부 사항을 다 설정해 주면
빌드(Build) 메소드를 불러올 수 있고
이것은 유저의 세부 사항을 만들고
이 유저 세부 정보를
InMemoryUserDetailsManager 생성자로 보낼 수 있게 됩니다
그래서 전 User에 그렇게 적용했습니다
저는 두 명의 유저를 만들고자 하는데
한명은 관리자(admin) 유저
한 명은 일반 유저로서
Read Not Admin 권한을 가지고 있습니다
1번 방법에 대한 이해가 충분하시리라 믿습니다
이제 웹 애플리케이션에
같은 방식으로 코딩을 해보겠습니다
IntelliJ IDEA 로 이동해서
ProjectSecurityConfig 클래스에
새로운 메소드를 만들 것입니다
Spring Security Configuration 다음에
Public(공개) 메소드를
InMemoryUserDetailsManager에 쓸 수 있습니다
메소드의 이름은 아무거나 쓰셔도 됩니다
하지만 여기서는 userDetailesService 이름으로 지정하려고 합니다
지금은 메소드를 비어 있는 상태로 유지하겠습니다
다음 단계로
@Bean 주석(어노테이션)을
이 메소드에 언급해야 합니다
@Bean 주석(어노테이션)을 만들기 위해
이 메소드에서 반환하려는 객체가 무엇이든
InMemoryUserDetailsManager 유형입니다
이것은 Spring 프레임워크에 의해 Bean으로 변경될 것입니다
Spring Security 프레임워크에 의해
동일한 Bean이 사용될 것입니다
이 Bean 메소드 안에
앞서 설명한 코드를 작성해야 합니다
좀 더 자세히 살펴보기 위해
여기에 몇 줄의 코드를 붙여넣겠습니다
여기에 몇 가지 Java 주석을 언급했습니다
User 클래스 아래에 있는
유저 세부 정보 인터페이스를 가져와야 합니다
필요한 클래스와 인터페이스를 불러왔으니
여기서 정확히 어떤 일이 일어나고 있는지 이해해 봅시다
먼저 User 클래스의 도움을 받아
withDefaultPasswordEncoder
라는 메소드를 호출하려고 합니다
지금은 일반 텍스트 비밀번호를 사용하고 싶기 때문에
withDefaultPasswordEncoder
를 불러와야 합니다
사용하지 않는 것을 권장한다고 나와있습니다
이 메소드를 열어보면
Spring팀은
이 메소드를 삭제할 생각이 없다는 걸
알 수 있습니다
하지만 개발자들은 이 메소드는 사용을 권장하지 않으며
이 방법은 프로덕션 애플리케이션에 사용하기에
안전하지 않다고 말하고 있습니다
그러나 우리는 에플리케이션의 메모리에서
유저를 구성하려고 하기 때문에
withDefaultPasswordEncoder를
사용해도 문제없습니다
그리고 이 User 클래스로 이동합니다
이것은 SpringSecurityProvider 클래스입니다
이 클래스는 이러한 유저 세부 정보 인터페이스를 구현합니다
이러한 유저(User)와 유저 세부 정보(UserDetails)의 세부사항은
다른 강의에서 살펴보겠습니다
하지만 지금은 이 User가 클래스이고
이 UserDetails는 인터페이스입니다
그렇기 때문에 User에서 UserDetails로
타입 캐스트하려고 할 때
오류가 발생하지 않습니다
둘 다 Java 내부의 inheritance 관계를 통해
부모자식 관계가 되기 때문입니다
withDefaultPasswordEncoder 메소드를
호출하면
username이라는 메소드를 하나 더 호출해야
username이 무엇인지 알 수 있고
그다음 마찬가지로 password 메소드를 하나 더 호출해야
비밀번호 값이 무엇인지 알 수 있습니다
마찬가지로 authorities(권한) 메소드도 있습니다
이것을 사용하여 이 특정 유저에게 어떤 권한이 있는지 정의할 수 있습니다
이 특정 유저를 보면
유저 이름이 'admin'으로
관리자 권한을 갖게 될 것입니다
그리고 마지막으로 build 메소드를 호출해야 합니다
이 build 메소드를 열면
제공된 유저 이름과 비밀번호를
또는 다른 불리언(Boolean) 과 함께 가진 유저의
새 객체를 생성하는 것입니다
이러한 요소들은 이 build 메소드에서
동일하게 결과가 반환됩니다
그래서 UserDetails 인터페이스를 이용해서
이해하려고 하는 것은 다음과 같습니다
이 접근 방식을 사용해서
유저를 얼마든지 만들 수 있습니다
보시다시피
여기에 유저를 하나 더 만들려고 합니다
유저 이름은 user이고 비밀번호는 12345입니다
그리고 이 유저가 가진 권한은 "read"입니다
일단 이 두 유저를 만들고 나면
이것을 InMemoryUserDetailsManager의
생성자에 전달합니다
이 생성자를 열어 보면
이 생성자는
어떤 수의 유저를 입력으로 받을 것입니다
여기에 표시된 세 개의 점은
Java 내에 변수 인수를 나타냅니다
3명, 10명, 20명 등 원하는 수의 유저를 전달할 수 있습니다
또한 이 생성자 안에는
우리가 전달한 유저 목록을
반복할 for 루프가 있습니다
그리고 최종적으로는 createUser라는 메소드를 호출할 것입니다
이렇게 하면 Spring Boot 애플리케이션의
메모리 안에 저장되는
원하는 수의 유저를 만들 수 있습니다
이 방법은 우리가 전에 했던
application.properties 내부에 정의한 내용보다 낫습니다
다음 단계로 application.properties로 이동합니다
그리고 우리가 구성한 정적인 유저 이름과
비밀번호를 제거합니다
이 줄을 제거하겠습니다
이를 통해 이러한 변경 사항을 저장할 수 있습니다
그리고 클릭하고 여기에서 빌드 하십시오
빌드가 완료되면
Main 클래스로 들어가서 디버그 옵션을 사용하기 시작하면
웹 애플리케이션을 시작할 수 있습니다
그러면 웹 애플리케이션을
디버그 모드로 8080포트에서 실행될 것입니다
이제 설정한 유저가
작용이 되었는지 브라우저로 이동해서
확인해 볼 것입니다
여기 브라우저에
먼저 공공 API 중 하나인 contact을
액세스하겠습니다
따라서 이 시나리오에서는 엔드 유저에게
표시되는 로그인 페이지가 없습니다
왜냐하면 이 API의 경우 모두 권한을 구성했습니다
이제
보호된 API의 myAccount에 액세스해보고자 합니다
따라서 액세스하려고 하면
확실히 로그인 페이지가 표시됩니다
그러나
이전에 application.properties 내부에
구성한 세부정보를 입력하려고 할 경우
제거했기 때문에 작동하지 않습니다
그렇기 때문에 서버의 메모리 내부에 설정한
캐릭터 자격 증명을 사용해야 합니다
따라서 유저 아이디는 admin이고 비밀번호는 12345입니다
로그인을 클릭해 보겠습니다
이제 액세스할 수 있는 것을 보실 수 있습니다
이제 제가 할 수 있는 일은 이 브라우저를 닫고
다시 열어서 다른 자격증명으로
로그인 시도를 합니다
이제 새로운 시크릿 브라우저가 생겼습니다
이번에는 myCards 경로에 액세스해 보겠습니다
액세스하려고 하면
확실히 자격증명을 물어볼 것입니다
이번에는 user에
비밀번호 12345를 사용해서 로그인해보겠습니다
따라서 이 사용자는 유효한 사용자이므로
클릭하면 로그인 작업이 수행됩니다
데이터베이스의 카드 세부 정보가 여기에 있습니다 라는
정보가 표시됩니다
그럼 이제 우리가 논의한 접근 방법 1과
InMemoryUserDetailsManager, UserDetails
그리고 User 클래스를 활용하여
Spring Boot 웹 애플리케이션의 메모리에
여러 사용자를 생성하는 방법에 대해
아주 명확하게 이해하셨으리라 생각합니다
이 모든 것들은 관계가 있습니다
그래서 앞으로의 강의에서
이 모든 유저 (user), UserDetails, UserDetailsManager 등
간의 관계에 대해 설명하겠습니다
그러나 현재로서는
이 접근 방법을 사용하여 웹 애플리케이션의 메모리에 유저를
생성하는 방법에 대해 잘 이해하셨다고 생각하겠습니다
다음 강의에서는 두 번째 접근 방식에 대해 배워보겠습니다
이번 방식과 비교하면 매우 작은 차이가 있습니다
감사합니다 다음 강의에서 뵙겠습니다
수고하셨습니다