- JWT ์ฅ์ : ๊ฐํธํ๊ณ ์ฝ๊ฒ ์ ์ฉ ๊ฐ๋ฅ โ ์ฌ์ด๋ ํ๋ก์ ํธ ์งํ ์ ์ ์ฉ
โ ์ด ๋ฌธ์์ด์ ํตํด ์๋ฒ์์ ํด๋น ํ ํฐ์ด ์ ์ฉํ์ง ๊ฒ์ฆ
- lombok ์ค์ (intellij ์ฌ์ฉ ์)
- HelloController.java ์์ฑ
- SecurityConfig.java ์์ฑ
- application.yml ์ค์
- entity ํจํค์ง ์์ฑ
- User entity์ ๋์ผ
-
security ์ค์ ์ถ๊ฐ
-
๋ฒ๊ทธ: #5
-
์คํ: shell์ ์ฟผ๋ฆฌ๋ฌธ ์ถ๋ ฅ
Hibernate: drop table if exists authority CASCADE Hibernate: drop table if exists user CASCADE Hibernate: drop table if exists user_authority CASCADE Hibernate: create table authority ( authority_name varchar(50) not null, primary key (authority_name) ) Hibernate: create table user ( user_id bigint generated by default as identity, activated boolean, nickname varchar(50), password varchar(100), username varchar(50), primary key (user_id) ) Hibernate: create table user_authority ( user_id bigint not null, authority_name varchar(50) not null, primary key (user_id, authority_name) ) Hibernate: alter table user add constraint UK_sb8bbouer5wak8vyiiy4pf2bx unique (username) Hibernate: alter table user_authority add constraint FK6ktglpl5mjosa283rvken2py5 foreign key (authority_name) references authority Hibernate: alter table user_authority add constraint FKpqlsjpkybgos9w2svcri7j8xy foreign key (user_id) references user
-
localhost:8080/h2-console โ [connect] ๋ฒํผ ํด๋ฆญํด์ ์ ์
- JWT ์ค์ ์ถ๊ฐ
- JWT ๊ด๋ จ ์ฝ๋ ๊ฐ๋ฐ
- Security ์ค์ ์ถ๊ฐ
-
TokenProvider.java
-
JwtFilter.java
-
JwtSecurityConfig.java
-
JwtAuthenticationEntryPoint.java
-
JwtAccessDeniedHandler.java
: User entity์ ๋งคํ๋๋ repository๋ฅผ ์์ฑํ๊ธฐ ์ํด, UserRepository
์ธํฐํ์ด์ค ์์ฑ
: SpringSecurity์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋์ธ UserDetailsService๋ฅผ ์ปค์คํ
ํ๊ฒ ๊ตฌํํ CustomUserDetailsService
ํด๋์ค ์์ฑ
(admin์ data.sql์ insert๋ฌธ์ด ์๋ฒ๊ฐ ์์๋ ๋ ์๋์คํ๋์ด db์ ์ ์ฅ๋ ์ํ)
โ ๊ฒฐ๊ณผ: ํ ํฐ ๋ฆฌํด
-
SecurityContext์ getAuthentication()์ ๊ฐ์ด Authentication ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ์์ :
// JwtFilter.java์ doFilter() ๋ฉ์๋ // request๊ฐ ๋ค์ด์ค๋ ์์ ์ SecurityContext์ Authentication ๊ฐ์ฒด๊ฐ ์ ์ฅ๋จ SecurityContextHolder.getContext().setAuthentication(authentication);
- ์ด๋ ์ ์ฅ๋ ๊ฐ์ฒด๊ฐ
// ์ฌ๊ธฐ์ ๊บผ๋ด์ง๊ฒ ๋จ // SecurityUtil.java์ getCurrentUsername() ๋ฉ์๋ SecurityContextHolder.getContext().getAuthentication();
(1) data.sql์ ๊ถํ์ USER, ADMIN
โ UserService์ ROLE_USER ๊ถํ๊ณผ์ ์ฐจ์ด๋ฅผ ํตํด ํ ์คํธ
(2) ์ค๋ฒ๋ก๋ฉ๋ ๋ ๊ฐ์ง getMyUserWithAuthorities() ๋ฉ์๋
โ ํ์ฉ ๊ถํ์ ๋ค๋ฅด๊ฒ ํด์, ๊ถํ ๊ฒ์ฆ ๋ถ๋ถ ํ ์คํธ
(1) ํ์๊ฐ์ ์งํ
Hibernate:
select
user0_.user_id as user_id1_1_0_,
authority2_.authority_name as authorit1_0_1_,
user0_.activated as activate2_1_0_,
user0_.nickname as nickname3_1_0_,
user0_.password as password4_1_0_,
user0_.username as username5_1_0_,
authoritie1_.user_id as user_id1_2_0__,
authoritie1_.authority_name as authorit2_2_0__
from
user user0_
left outer join
user_authority authoritie1_
on user0_.user_id=authoritie1_.user_id
left outer join
authority authority2_
on authoritie1_.authority_name=authority2_.authority_name
where
user0_.username=?
Hibernate:
insert
into
user
(user_id, activated, nickname, password, username)
values
(default, ?, ?, ?, ?)
Hibernate:
insert
into
user_authority
(user_id, authority_name)
values
(?, ?)
(2) ๊ฐ์ ์ ๋ณด h2-console์์ ํ์ธ
- test3 ๊ณ์ ์ USER ๊ถํ์ ๊ฐ์ง๊ณ ์์
- admin ๊ณ์ ์ ROLE_ADMIN, ROLE_USER ๊ถํ 2๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์์
(1) ADMIN ๊ถํ๋ง ํ์ฉํ๋ api ํ ์คํธ
@GetMapping("/admin/{username}")
@PreAuthorize("hasAnyRole('ADMIN')") // ADMIN ๊ถํ๋ง ํธ์ถ
public ResponseEntity<User> getAdminInfo(@PathVariable String username) {
return ResponseEntity.ok(userService.getUserWithAuthorities(username));
}
-
โ ๊ทธ๋ฅ ์คํํ๋ฉด ์๋ฌ๋จ
-
USER, ADMIN ๊ถํ ๋ชจ๋ ๊ฐ์ง admin ๊ณ์ ์ผ๋ก ํ ํฐ ๋ฐ๊ธ
-
Authorization ํญ์ ํ ํฐ ์ ์ฌ
// Tests ํญ var jsonData = JSON.parse(responseBody) // responseBody์ jsonDate๋ฅผ ํ์ฑ pm.globals.set("jwt_tutorial_token", jsonData.token); // jsonData.token: token ํ๋์ ์๋ ๊ฐ์ // โjwt_tutorial_tokenโ ๋ณ์์ ๋ด์
- โ ์ด๋ ๊ฒ ํด ๋์ผ๋ฉด ๋ค๋ฅธ request์์๋ ํด๋น ๋ณ์์ ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ
(2) admin ๊ณ์ ํ ํฐ์ผ๋ก test1 ๊ณ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
-
/api/user/test1 :
("hasAnyRole('USER')") // USER ๊ถํ๋ง ํธ์ถ
-
/api/admin/test1 :
("hasAnyRole('ADMIN')") // ADMIN ๊ถํ๋ง ํธ์ถ
โ ๋ ๋ค ๋์ผํ test1 ๊ณ์ ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋จ
(3) admin ๊ณ์ ํ ํฐ์ด ์๋ test1 ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋๋ค๋ฉด?
โ ์๋ก ๋ฐ๊ธ๋ ํ ํฐ์ โjwt_tutorial_tokenโ ์ ์ญ๋ณ์์ ๋ด๊ฒจ์ง๊ฒ ๋จ
-
("hasAnyRole('ADMIN')") // ADMIN ๊ถํ๋ง ํธ์ถ
โ 403 Forbidden ์ค๋ฅ ๋ฐ์โ test1 ๊ณ์ ์ผ๋ก ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ํด๋น api๋ฅผ ํธ์ถํ๋ ๊ถํ์ด ์์
โ 403 Forbidden ์ค๋ฅ: JwtAccessDeniedHandler๊ฐ ์๋
-
/api/user/test1:
("hasAnyRole('USER')") // USER ๊ถํ๋ง ํธ์ถ
โ ์ ์ ์๋
- /api/user:
("hasAnyRole('USER','ADMIN')") // @PreAuthorize๋ฅผ ํตํด USER, ADMIN ๋ ๊ฐ์ง ๊ถํ ๋ชจ๋ ํ์ฉ
โ ์ ์ ์๋