Spring MVC ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization or ๊ถํ ๋ถ์ฌ) ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ณด์ ํ๋ ์์ํฌ
โ
( Spring MVC ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด์์ ์ ์ฉํ๊ธฐ์ํ ์ฌ์ค์์ ํ์ค )
ํน์ ๋ณด์ ์๊ตฌ ์ฌํญ์ ๋ง์กฑ์ํค๊ธฐ ์ํ ์ฝ๋์ ์ปค์คํฐ๋ง์ด์ง์ด ์ฉ์ดํ๊ณ ์ ์ฐํ ํ์ฅ์ด ๊ฐ๋ฅ
๐ก ์ ๊ตณ์ด Spring Security๋ฅผ ์ฌ์ฉํ ๊น?
โ Apache Shiro, OACC์ ๊ฐ์ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ณด์ ํ๋ ์ ์ํฌ๊ฐ ์กด์ฌํ์ง๋ง Spring Security๋งํ ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ์กด์ฌํ์ง ์์
โ
[Apache Shiro ์ฐธ๊ณ ] https://shiro.apache.org/
[OACC ์ฐธ๊ณ ] http://oaccframework.org/
- [์ธ์ ๊ณ ์ ์ฐธ๊ณ ] https://owasp.org/www-community/attacks/Session_fixation
- [ํด๋ฆญ์ฌํน ์ฐธ๊ณ ] https://ko.wikipedia.org/wiki/%ED%81%B4%EB%A6%AD%EC%9E%AC%ED%82%B9
- [CSRF ์ฐธ๊ณ ] https://namu.wiki/w/CSRF
๋ค์ํ ์ ํ(ํผ ๋ก๊ทธ์ธ ์ธ์ฆ, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ, OAuth 2 ๊ธฐ๋ฐ ์ธ์ฆ, LDAP ์ธ์ฆ)์ ์ฌ์ฉ์ ์ธ์ฆ ๊ธฐ๋ฅ ์ ์ฉ
์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์์ ์ญํ (Role)์ ๋ฐ๋ฅธ ๊ถํ ๋ ๋ฒจ ์ ์ฉ
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ์ ์ด
๋ฏผ๊ฐํ ์ ๋ณด์ ๋ํ ๋ฐ์ดํฐ ์ํธํ
SSL ์ ์ฉ
์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง ์น ๋ณด์ ๊ณต๊ฒฉ ์ฐจ๋จ
๐ก ์ ์ ์ฆ๋ช ์ ๋ณด (Credential)
- ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ๋ณด
Ex. ์ฃผ๋ฏผ๋ฑ๋ก์ฆ, ํจ์ค์๋ ๋ฑ
โ๏ธ 2 ํฉํฐ(factor) ์ธ์ฆ
- ์ธ์ฆ์ 2๋ฒ ๋ฐ์์ผ ํ๋ ์ธ์ฆ
Ex. ์จ๋ผ์ธ ๋ฑ ํน - 1์ฐจ ์ธ์ฆ : ๊ณต์ธ์ธ์ฆ์ / 2์ฐจ ์ธ์ฆ : OTP
Authentication(์ธ์ฆ)์ด ์ ์์ ์ผ๋ก ์ํ๋ ์ฌ์ฉ์์๊ฒ ํ๋ ์ด์์ ๊ถํ(authority)์ ๋ถ์ฌํ์ฌ ํน์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ํ๊ฐํ๋ ๊ณผ์
Ex. ๋นํ๊ธฐ ์ข์ / ๊ทน์ฅ ํฐ์ผ๋ณ ์ข์ ๋ฑ
๋ฐ๋์ Authentication ๊ณผ์ ์ดํ ์ํ๋์ด์ผ ํจ
๊ถํ์ ๋ณดํต ์ญํ (Role) ํํ๋ก ๋ถ์ฌ
โ URL์ ์ ๊ทผํ ๊ถํ์ด ์๋์ง ํ์ธ
Ex. ๊ด๋ฆฌ์ / ์ฌ์ฉ์
โ ์ด๋ฒ์๋ SSR(Server Side Rendering) ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ Hello Spring Security ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ฉํ์ฌ ์ค์ต์ ์งํํจ
โ
โ Spring Security์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ๋์ ๋ฐฉ์์ ์ดํดํ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ์์ด ๋ฐ๋ก ์๋ฒ์์ HTML์ ๋ง๋ค์ด ํด๋ผ์ด์ธํธ ์ชฝ์ผ๋ก ๋ด๋ ค์ฃผ๋ SSR(Server Side Rendering) ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ
โ
โ์ค์ต์์๋ Spring Security๋ฅผ ์ ์ฉํด ๋ชจ๋ ์ฌ์ฉ์๋ค์ด ์ ๊ทผ ๊ฐ๋ฅํ ํ๋ฉด์ด ๋๋๋ก ์ค์ ํ ์ ์๊ธฐ๋ง ํ๋ฉด๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฒด์ ์ธ ์ปจํ ์ธ ๊ฐ ์์ ์ ์์ !
โ
โ๏ธ SSR(Server Side Rendering) ๋ฐฉ์
โ ์ธ์ ๊ธฐ๋ฐ์ ํผ ๋ก๊ทธ์ธ ๋ฐฉ์์ ์ ์ฉํ๊ธฐ ๊ฐ์ฅ ์ ํฉํ ์ ํ๋ฆฌ์ผ์ด์
โ
โ๏ธ ํผ ๋ก๊ทธ์ธ ๋ฐฉ์
โ Spring Security์ ์ฒ์ ์ ๋ฌธํ๋ ์ ๋ฌธ์๋ค์ด Spring Security๋ฅผ ์ดํดํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ ์ธ์ฆ ๋ฐฉ์
โ ์ด์ ์ค์ต๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์ ์ฉ๋์ง ์์๋ ๊ฒ
๋ก๊ทธ์ธ ๊ธฐ๋ฅ(์ธ์ฆ, Authentication)์ด ์์
โ ๋ค๋ฅธ ์ฌ๋์ด ์ ํ๋ฆฌ์ผ์ด์
์ API๋ฅผ ํธ์ถํด์ ์ผ๋ง๋ ์ง ์ ๋ณด ์กฐํ ๊ฐ๋ฅ
API์ ๋ํ ๊ถํ ๋ถ์ฌ(์ธ๊ฐ, Authorization) ๊ธฐ๋ฅ์ด ์์
โ ์๋์ด ๋ง์๋๋ก ์ปคํผ ์ ๋ณด๋ฅผ ๋ฑ๋ก ๊ฐ๋ฅ
์น ๋ณด์ ์ทจ์ฝ์ ์ ๋ํ ๋๋น๊ฐ ์ ํ ์ด๋ฃจ์ด์ง์ง ์์์
โ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ํํ๋ ์ธ์
๊ณ ์ ๊ณต๊ฒฉ, ํด๋ฆญ์ฌํน ๊ณต๊ฒฉ, CSRF ๋ฑ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ํ ๊ณ ๋ ค๊ฐ ์ ํ ์ด๋ฃจ์ด์ง์ง ์์ ์ํ
build.gradel
ํ์ผ์ ์๋์ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐimplementation 'org.springframework.boot:spring-boot-starter-security'
โ ์ด๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ์ค์ต ๋ด์ฉ์ ์คํํ๊ณ localhost:8080
์ ์ ์ํ์ ๋ ๋๊ตฌ๋ ์ ์์ด ๊ฐ๋ฅํ ๋ฐ๋ฐํ ํ๋ฉด์ด์๋๋ฐ,
์ถ๊ฐํ ํ์๋ Spring Security์ ์๋ ๊ตฌ์ฑ์ ํตํด ๋ํดํธ ๋ก๊ทธ์ธ ํ์ด์ง๊ฐ ๋ง๋ค์ด์ ธ ๊ทธ ํ๋ฉด์์ ๋ก๊ทธ์ธ์ ํด์ผ๋ง ํ์ด์ง์ ๋ค์ด๊ฐ ์ ์๋๋ก ํจ
๐ก ํ์ ๋ฑ๋ก ์ ์ ์ด ํ๋ฉด์ ์ฌ์ฉํด๋ณด๊ณ ์ถ๋ค๋ฉด,
Spring Security์์ ์ ๊ณตํด์ฃผ๋ ๋ํดํธ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์์ !
โ
- Username:
user
์ ๋ ฅ- Password: ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์ ๋ง๋ค ์ถ๋ ฅ๋๋ ๋ก๊ทธ์์ ํ์ธ ๊ฐ๋ฅ
โฌ๏ธ ์๋์ ๋ก๊ทธ์ธ์ ํด์ผ์ง๋ง ์๊ฒฉ ์ฆ๋ช ์ ์ฑ๊ณตํ์ฌ ์ฐ๋ฆฌ๊ฐ ์๋ ๋ณด๋ ํ๋ฉด์ ๋ณผ ์ ์์ !
โ โ - But, ์ด ๋ฐฉ์์ ์๋์ ๋ฌธ์ ์ ๋๋ฌธ์ ์ค๋ฌด์์ ์ฌ์ฉํ๊ธฐ์ ๋ฌด๋ฆฌ
- ์ ํ๋ฆฌ์ผ์ด์ ๋งค๋ฒ ์คํํ ๋๋ง๋ค ํจ์ค์๋ ๋ฐ๋
- ํ์ ๊ฐ์์ ์ธ์ฆ ์ ๋ณด๋ก ๋ก๊ทธ์ธ ๋ถ๊ฐ
โ
โ Spring Security์ Configuration์ผ๋ก ์ํ๋ ์ธ์ฆ ๋ฐฉ์ ์ค์ ๊ฐ๋ฅ
InMemory ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ์์ํ๋ฉด ์ ๋ณด๊ฐ ๋ชจ๋ ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ํ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์์ ๊ด๋ฆฌ
์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ๊ทธ ์ค ํ๋์ธ Custom UserDetailsService ๋ฅผ ์ด์ฉํ ๊ฒ์
๐ก Spring Security์์๋ ์ธ์ฆ์ ์๋ํ๋ ์ฃผ์ฒด๋ฅผ User๋ผ๊ณ ๋ถ๋ฆ
(๋น์ทํ ์๋ฏธ๋ก Principal๋ ์์)
โ๏ธ Principal
โ User์ ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด ์๋ฏธ
( ์ผ๋ฐ์ ์ผ๋ก Spring Security์์์ Username์ ์๋ฏธ )
SecurityConfigurationV2
ํด๋์ค ์ถ๊ฐ
โ SecurityConfigurationV1
์์ Memory์ ์ง์ ์ ์ฅํ๋ userDetailsService()
๋ฉ์๋ ์ ๊ฑฐ
PasswordEncoder ์ฐธ๊ณ
bcrypt ์๊ณ ๋ฆฌ์ฆ ์ฐธ๊ณ
Clickjacking ๊ณต๊ฒฉ ์ฐธ๊ณ 1
Clickjacking ๊ณต๊ฒฉ ์ฐธ๊ณ 2
JavaConfigurationV2
ํด๋์ค ์ถ๊ฐ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ User์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด MemberService
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์ค๋ฅผ DBMemberService
๋ก ๋ณ๊ฒฝ
DBMemberServiceV2
ํด๋์ค ์ถ๊ฐ
โ DBMemberServiceV1
+ ํ์ ๊ฐ์
์, User ์ ๊ถํ ์ ๋ณด(Role)๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ฝ๋
HelloUserDetailsServiceV1
ํด๋์ค ์ถ๊ฐ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ User ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ Custom UserDetailsService
โ
โ InMemory User ๋ฑ๋กํ๋๋ฐ ์ฌ์ฉํ๋ InMemoryUserDetailsManager
๋ UserDetailsManager
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ด๊ณ ,
UserDetailsManager
๋ UserDetailsService
๋ฅผ ์์ํ๋ ํ์ฅ ์ธํฐํ์ด์ค์
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ User ์ ์ธ์ฆ ์ ๋ณด๋ง Spring Security ์๊ฒ ๋๊ฒจ์ฃผ๊ณ ,
์ธ์ฆ ์ฒ๋ฆฌ๋ Spring Security๊ฐ ๋์ ํด์ค
HelloAuthorityUtils
ํด๋์ค ์ถ๊ฐ
โ HelloUserDetailsService
์์ Role ๊ธฐ๋ฐ์ User ๊ถํ์ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ
application.yml
ํ์ผ์ ๊ด๋ฆฌ์ ์ด๋ฉ์ผ ์ฃผ์ ์ ์
( ์ค๋ฌด์์ ์ด๋ ๊ฒ ์ํจ )
๐ ์ฌ๊ธฐ๊น์ง ํด๋ postman ์ผ๋ก ๋ฉค๋ฒ ๋ฑ๋ก ํ H2๋ก ๋ค์ด๊ฐ์ DB๋ฅผ ๋ณด๋ฉด PASSWORD ์ปฌ๋ผ์ ์ ๋ณด๊ฐ ์ํธํ๊ฐ ๋์ด ๋ฑ๋ก๋์ด ์๋ ๊ฒ ํ์ธ ๊ฐ๋ฅ !
HelloUserDetailsServiceV2
ํด๋์ค ์ถ๊ฐ
( HelloUserDetailsServiceV1 ์ ๋ช ๋ถ๋ถ ๊ฐ์ )
User์ Role์ DB์์ ๊ด๋ฆฌํ๊ธฐ
8-1. Member ์ํฐํฐ ํด๋์ค์ User ๊ถํ ์ ๋ณด ๋งคํ
โ @ElementCollection
์ ๋ํ
์ด์
์ถ๊ฐํ์ฌ ๋ฐ๋ก ์ํฐํฐ ํด๋์ค ๋ง๋ค์ง ์๊ณ ๋งคํ
8-2. DBMemberServiceV2
ํด๋์ค์ ์ฝ๋ ์ถ๊ฐ
โ ํ์ ๋ฑ๋ก ์, ํ์์ ๊ถํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ฝ๋ ์ถ๊ฐ
8-3. HelloAuthorityUtils ํด๋์ค์ ์ฝ๋ ์ถ๊ฐ
โ DB ์ ์ฅ์ฉ createRoles()
๋ฉ์๋ ์ถ๊ฐ
๋ก๊ทธ์ธ ์ธ์ฆ ์, User์ ๊ถํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ ์์
9-1. HelloUserDetailsServiceV3
ํด๋์ค ์ถ๊ฐ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ MEMBER_ROLES ํ
์ด๋ธ์์ ์กฐํํ Role ๊ธฐ๋ฐ์ผ๋ก
User ์ ๊ถํ ๋ชฉ๋ก(List<GrantedAuthority>
)์ ์์ฑํ๋ ๋ก์ง ์ถ๊ฐ
9-2. HelloAuthorityUtils
ํด๋์ค์ ์ฝ๋ ์ถ๊ฐ
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ Role ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก User ์ ๊ถํ ๋ชฉ๋ก ์์ฑํ๋ createAuthorities(List<String> roles)
๋ฉ์๋ ์ถ๊ฐ
โ ๊ธฐ์กด์๋
application.yml
ํ์ผ์mail.address.admin
ํ๋กํผํฐ์ ์ ์๋ ๊ด๋ฆฌ์์ฉ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌ์ Role ์ถ๊ฐํ์ง๋ง,
์ด์ ๋ ๊ทธ๋ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ง๊ณ ์จ Role ๋ชฉ๋ก(List<String> roles
)์ ๊ทธ๋๋ก ์ด์ฉํด์ ๊ถํ ๋ชฉ๋ก(authorities)์ ๋ง๋ค๋ฉด ๋จ
๐ ์ฌ๊ธฐ๊น์ง ํ๋ฉด ํ์๊ฐ์ ํ, ๋ก๊ทธ์ธ๊น์ง ์ฑ๊ณต ๊ฐ๋ฅ !
โ Spring Security ๊ฐ ๋ก๊ทธ์ธ ์ธ์ฆ์ ๋์ ํด์ฃผ์ง๋ง ํ๋ฆ์ ์ดํด๋ฅผ ์ํด ์ง์ ๋ง๋๋ ์ธ์ฆ ์ฒ๋ฆฌ ๋ก์ง์
HelloUserAuthenticationProvider
ํด๋์ค ์ถ๊ฐAuthenticationProvider
์ธํฐํ์ด์ค์ ๊ตฌํ ํด๋์คAuthenticationProvider
- Spring Security
์์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ธ์ฆ๋ ์ฌ์ฉ์์ธ์ง์ ๋ํ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ Spring Security ์ปดํฌ๋ํธSSR ๋ฐฉ์ Controller ๊ตฌํ ๋ฐฉ์ ์ฐธ๊ณ
Ant Pattern ์ฐธ๊ณ
XML Name Space ์ฐธ๊ณ
์ผ์
์ ์ฉํ๋๊ฒ ๋๋ ์ด๋ ต๋ค.
์๋ ๋๋ฌด ๋ง์์ ์ดํด๋ ์ด๋ ค์์ ์์ง๊น์ง ๋ธ๋ก๊ทธ ์ด๋ป๊ฒ ์จ์ผํ ์ง ๊ฐ์ ๋ชป์ก๋ ์ค ใ
ใ
๋ ์ดํดํ๊ณ ์ฃผ๋ง๊น์ง ์์ / ๋ณด์ ํด์ผ๊ฒ ๋ค.