๐Ÿ’ Spring/Spring Security

6. JWT๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์„ธํŒ…

2021. 10. 31. 22:08
๋ชฉ์ฐจ
  1. dependency ์ถ”๊ฐ€
  2. application.yml ์„ค์ •
  3. User ์ƒ์„ฑ
  4. SecurityConfig
  5. CorsConfig
๋ฐ˜์‘ํ˜•

์ด ํฌ์ŠคํŠธ๋Š” ๋ฐ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋‹˜์˜ ์œ ํŠœ๋ธŒ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚˜์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

dependency ์ถ”๊ฐ€

  • Maven
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.16.0</version>
</dependency>

 

  • Gradle
// https://mvnrepository.com/artifact/com.auth0/java-jwt
implementation group: 'com.auth0', name: 'java-jwt', version: '3.16.0'

 

 

application.yml ์„ค์ •

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://localhost:3306/JwtTutorial"
    username: "root"
    password: "1234"

  jpa:
    hibernate:
      ddl-auto: create
    database: mysql
    show-sql: true

jpa, db ์„ค์ • ๋ง๊ณ ๋Š” ๋”ฑํžˆ ํ•ด์ค„๊ฑด ์—†๋‹ค..

 

User ์ƒ์„ฑ

@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    @Enumerated(EnumType.STRING)
    private USER_ROLES roles;

}

 

USER_ROLES

public enum USER_ROLES {
    ROLE_ADMIN, ROLE_USER
}

 

SecurityConfig

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CorsFilter corsFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // Session์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Stateless ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
                .and()
                .addFilter(corsFilter)  // Cross-Origin ์ •์ฑ… ์‚ฌ์šฉ X ๋ชจ๋“  ์š”์ฒญ ํ—ˆ์šฉ ** @CrossOrigin๊ณผ์˜ ์ฐจ์ด์  : @CrossOrigin์€ ์ธ์ฆ์ด ์—†์„ ๋•Œ ๋ฌธ์ œ, ๊ทธ๋ž˜์„œ ์ง์ ‘ ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ์— ๋“ฑ๋ก!
                    .formLogin().disable()
                    .httpBasic().disable()
                .authorizeRequests()
                    .antMatchers("/api/v1/user/**")
                        .hasAnyRole("USER", "MANAGER", "ADMIN")
                    .antMatchers("/api/v1/manager/**")
                        .hasAnyRole("MANAGER", "ADMIN")
                    .antMatchers("/api/v1/admin/**")
                        .hasRole("ADMIN")
                    .anyRequest().permitAll()
                ;
    }
}
  • csrf().disable() : ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์น˜ ์•Š์€ ์š”์ฒญ(csrf)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ disableํ•œ๋‹ค.
  • sessionManagement().sessionCreationPolicy(SessionCreatationPolicy.STATLESS) : Session์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„๋ฅผ Statelessํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
  • formLogin(), httpBasic() : disable
  • "/api/v1/user/**" ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์€ USER, MANAGE, ADMIN ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • "/api/v1/manager/**" ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์€ MANAGE, ADMIN ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • "/api/v1/admin/**" ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ์€ ADMIN ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ ์™ธ ๋‚˜๋จธ์ง€ ์š”์ฒญ์€ ๋ชจ๋‘ ํ—ˆ์šฉํ•œ๋‹ค.

 

CorsConfig

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);   // ๋‚ด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ํ•  ๋•Œ ์‘๋‹ตํ•ด์ค€ json์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ• ์ง€๋ฅผ ์„ค์ •
        config.addAllowedOrigin("*");       // ๋ชจ๋“  ip์— ์‘๋‹ต ํ—ˆ์šฉ
        config.addAllowedHeader("*");       // ๋ชจ๋“  header์— ์‘๋‹ต ํ—ˆ์šฉ
        config.addAllowedMethod("*");       // ๋ชจ๋“  HTTP Method ์š”์ฒญ ํ—ˆ์šฉ

         source.registerCorsConfiguration("/api/**", config);    // /api/** ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์š”์ฒญ๋“ค์€ config๋ฅผ ๋”ฐ๋ฅด๋„๋ก ๋“ฑ๋ก!

        return new CorsFilter(source);
    }
}
  • CORS(Cross-Origin Resource Sharing) : ์‰ฝ๊ฒŒ ๋งํ•ด ๋„๋ฉ”์ธ์ด ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด CORS ์ •์ฑ…์„ ์œ„๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฐœ์ƒ!
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ?
    1. CorsConfiguration ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ์›ํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ํ—ˆ์šฉ์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    2. HTTP OPTION์œผ๋กœ ๋จผ์ € ์˜ˆ๋น„ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด ๊ทธ๋•Œ GET or POST๋กœ ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. (์ƒ๋žต)
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  1. dependency ์ถ”๊ฐ€
  2. application.yml ์„ค์ •
  3. User ์ƒ์„ฑ
  4. SecurityConfig
  5. CorsConfig
'๐Ÿ’ Spring/Spring Security' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • 8. JWT๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ Filter ๋“ฑ๋ก ํ…Œ์ŠคํŠธ
  • 7. JWT๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „ Basic, Bearer ๋ฐฉ์‹
  • 5. JWT ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ
  • 4. JWT๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ „ RSA์— ๋Œ€ํ•ด์„œ
iseunghan
iseunghan
๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan๊พธ์ค€ํ•˜๊ฒŒ ์—ด์‹ฌํžˆ..
iseunghan
iseunghan

๊ณต์ง€์‚ฌํ•ญ

  • ์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์˜ค๋Š˜์ด ๋˜๊ธฐ ์œ„ํ•ด ๐Ÿ”ฅ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (261)
    • ๐Ÿ’ Spring (14)
      • ๊ฐœ๋… ๋ฐ ์ดํ•ด (2)
      • Spring ํ•ต์‹ฌ ๊ธฐ์ˆ  (24)
      • Spring REST API (8)
      • Spring MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ  (7)
      • Spring Security (23)
      • Spring in Action (1)
    • ๐ŸŒป JAVA (84)
      • ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ (20)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ž๋ฃŒ๊ตฌ์กฐ (13)
      • ๋””์ž์ธ ํŒจํ„ด (7)
      • ์ •๋ฆฌ์ •๋ฆฌ์ •๋ฆฌ (43)
      • JUnit (1)
    • ๐Ÿ”– Snippets (3)
      • Javascript (3)
    • โš™๏ธ Devops (22)
      • โ› Git (11)
      • ๐Ÿณ Docker (6)
      • ๐Ÿง Linux (3)
      • ๐ŸŒˆ Jenkins (1)
      • ๐Ÿ“ฌ Kafka (1)
    • ๐Ÿ’ฌ ETC.. (4)
      • ๐Ÿ’ป macOS (2)
    • ๐ŸŒง๏ธ ORM (2)
      • JPA (2)
    • ๐Ÿ Python (2)
    • ๐Ÿ“š Databases (15)
      • ์˜ค๋ผํด๋กœ ๋ฐฐ์šฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ก ๊ณผ ์‹ค์Šต(2ํŒ) (3)
      • RealMySQL 8.0 (8)
    • ๐Ÿ”ฅ Computer Science (5)
      • ๐Ÿ“ก ๋„คํŠธ์›Œํฌ (5)
    • ๐Ÿท๏ธ ํ˜‘์—… (1)
    • ๐Ÿ“œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (38)
      • BAEKJOON\์ˆ˜ํ•™ 1, ์ˆ˜ํ•™ 2 (8)
      • BAEKJOON\์žฌ๊ท€ (5)
      • BAEKJOON\๋ธŒ๋ฃจํŠธ ํฌ์Šค (3)
      • BAEKJOON\์ •๋ ฌ (1)
      • BAEKJOON\๋ฐฑํŠธ๋ž˜ํ‚น (5)
      • BAEKJOON\BFS, DFS (6)
      • BAEKJOON\์ด๋ถ„ํƒ์ƒ‰ (1)
      • BAEKJOON\๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ (9)
      • BAEKJOON\๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ (0)
    • โœจ ISEUNGHAN (1)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
๋ฐ˜์‘ํ˜•
hELLO ยท Designed By ์ •์ƒ์šฐ.
iseunghan
6. JWT๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์„ธํŒ…
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.