Skip to content

Commit 50d0779

Browse files
authored
Merge pull request #16 from ddankey/report
feat: Cors Security 설정
2 parents 21ade4b + b37d700 commit 50d0779

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ dependencies {
8181
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
8282
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
8383
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
84+
85+
// AWS
86+
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.661'
8487
}
8588

8689
tasks.named('test') {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.ddanguizip.server.global.config;
2+
3+
import com.amazonaws.auth.AWSStaticCredentialsProvider;
4+
import com.amazonaws.auth.BasicAWSCredentials;
5+
import com.amazonaws.services.s3.AmazonS3;
6+
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
7+
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
@Configuration
12+
public class S3Config {
13+
14+
@Value("${cloud.aws.credentials.accessKey}")
15+
private String accessKey;
16+
17+
@Value("${cloud.aws.credentials.secretKey}")
18+
private String secretKey;
19+
20+
@Value("${cloud.aws.region.static}")
21+
private String region;
22+
23+
@Bean
24+
public AmazonS3 amazonS3Client() {
25+
return AmazonS3ClientBuilder.standard()
26+
.withCredentials(
27+
new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))
28+
)
29+
.withRegion(region)
30+
.build();
31+
}
32+
}

src/main/java/com/ddanguizip/server/global/config/SecurityConfig.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import org.springframework.security.config.http.SessionCreationPolicy;
1010
import org.springframework.security.web.SecurityFilterChain;
1111
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
12+
import org.springframework.web.cors.CorsConfiguration;
13+
import org.springframework.web.cors.CorsConfigurationSource;
14+
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
15+
16+
import java.util.List;
1217

1318

1419
@Configuration
@@ -18,6 +23,8 @@ public class SecurityConfig {
1823

1924
@Bean
2025
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
26+
// CORS 허용, CSRF 비활성화
27+
// httpBasic, httpFormLogin 비활성화
2128
http.cors(Customizer.withDefaults())
2229
.csrf(AbstractHttpConfigurer::disable)
2330
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
@@ -31,4 +38,28 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
3138

3239
return http.build();
3340
}
41+
42+
/**
43+
* CORS 허용하도록 커스터마이징 진행
44+
* @return - 변경된 CORS 정책 정보 반환
45+
*/
46+
@Bean
47+
CorsConfigurationSource corsConfigurationSource() {
48+
CorsConfiguration config = new CorsConfiguration();
49+
50+
// 인증정보 주고받도록 허용
51+
config.setAllowCredentials(true);
52+
// 허용할 주소
53+
config.setAllowedOriginPatterns(List.of("*"));
54+
// 허용할 HTTP Method
55+
config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
56+
// 허용할 헤더 정보
57+
config.setAllowedHeaders(List.of("*"));
58+
config.setExposedHeaders(List.of("*"));
59+
60+
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
61+
source.registerCorsConfiguration("/**", config);
62+
63+
return source;
64+
}
3465
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.ddanguizip.server.global.util;
2+
3+
import com.amazonaws.HttpMethod;
4+
import com.amazonaws.services.s3.AmazonS3;
5+
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.stereotype.Component;
9+
10+
import java.util.Date;
11+
12+
@Component
13+
@RequiredArgsConstructor
14+
public class S3Client {
15+
16+
private final AmazonS3 amazonS3;
17+
18+
@Value("${cloud.aws.s3.bucket}")
19+
private String bucket;
20+
21+
public String generatePreSignedUrl(String fileName, String contentType) {
22+
Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 5); // 5분 유효
23+
24+
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, fileName)
25+
.withMethod(HttpMethod.PUT)
26+
.withExpiration(expiration);
27+
request.setContentType(contentType);
28+
29+
return amazonS3.generatePresignedUrl(request).toString();
30+
}
31+
}

0 commit comments

Comments
 (0)