Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20기_유지민] Docker & API 리팩토링 미션 제출합니다. #54

Open
wants to merge 6 commits into
base: jiminnimij
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:17
ARG JAR_FILE=/build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar", "/app.jar"]
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ dependencies {
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'mysql:mysql-connector-java:8.0.34'

runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
implementation 'org.springframework.boot:spring-boot-starter-security'
Expand Down
30 changes: 30 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
version: "3"

services:
db:
image: mysql:5.7 #windows
environment:
MYSQL_ROOT_PASSWORD: root1234

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.env 파일에 민감한 정보를 저장하고, 환경변수를 불러오는 방식으로 수정해보는 것은 어떨까요?
docker-compose 파일과 같은 위치에 .env 파일을 생성하면 별도 설정 없이 환경변수를 가져올 수 있어요!

MYSQL_DATABASE: instagram
volumes:
- dbdata:/var/lib/mysql
ports:
- 3306:3306
restart: always

web:
container_name: web
build: .
ports:
- "8080:8080"
depends_on:
- db
environment:
mysql_host: db
restart: always
volumes:
- app:/app

volumes:
dbdata:
app:
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
import com.ceos20.instagram.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.Optional;
@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -66,7 +68,7 @@ public String reissue(String refreshToken) {
User user = userRepository.findByNickname(nickname)
.orElseThrow(() -> new NotFoundException(ExceptionCode.NOT_FOUND_USER));

return jwtUtil.generateAccessToken(nickname, user.getRole());
return jwtUtil.generateAccessToken(nickname, user.getRole().toString());
} else {
throw new RuntimeException("존재하지 않는 토큰입니다.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public JwtAuthenticationFilter loginAuthenticationFilter() throws Exception {
// 시큐리티 필터 설정
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, JwtUtil jwtUtil) throws Exception {
final String[] ALL_URL = new String[] {"/accounts/login", "/accounts/user/signup"};
final String[] ALL_URL = new String[] {"/accounts/login", "/accounts/user/signup", "/swagger-ui.html", "/swagger-ui/**", "/v3/api-docs/**"};

http
.cors((cors -> cors.configurationSource(new CorsConfigurationSource() {
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/com/ceos20/instagram/jwt/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ public String getUserNickname(String token) {
return Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(token).getBody().getSubject();
}

// 토큰에서 유효시가 추출
public long getExpiration(String token) {
return Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(token).getBody().getExpiration().getTime();
}


// Request의 Header에서 token 값
public String resolveToken(HttpServletRequest request) {
return request.getHeader("X-AUTH-TOKEN");
Expand All @@ -92,5 +98,6 @@ public boolean validateToken(String token) {
}



}

Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo

redisService.save(nickname, refreshToken, Duration.ofMillis(jwtUtil.getExpiration(refreshToken)));

// Cookie accessTokenCookie = createCookie(accessToken, "accessToken");
Cookie refreshTokenCookie = createCookie(refreshToken, "refreshToken");

response.addHeader("Authorization", "Bearer " + accessToken);
Expand All @@ -57,13 +56,12 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().write(jsonResponse);

// response.addCookie(accessTokenCookie);
response.addCookie(refreshTokenCookie);
}

private Cookie createCookie(String accessToken, String cookieName) {
Cookie accessTokenCookie = new Cookie(accessToken, cookieName);
long expiration = jwtUtil.v(accessToken);
long expiration = jwtUtil.getExpiration(accessToken);
int maxAge = (int)((expiration - new Date(System.currentTimeMillis()).getTime()) / 1000);
accessTokenCookie.setMaxAge(maxAge);
accessTokenCookie.setPath("/");
Expand Down
26 changes: 20 additions & 6 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,31 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/instagram
url: jdbc:mysql://localhost:3306/instagram?useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root1234
jpa:
database: mysql
database-platform: org.hibernate.dialect.MySQL8Dialect
database-platform: org.hibernate.dialect.MySQL5Dialect
hibernate:
ddl-auto: create
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
database-platform: org.hibernate.dialect.MySQL8Dialect
dialect: org.hibernate.dialect.MySQL5Dialect
database-platform: org.hibernate.dialect.MySQL5Dialect
show_sql: true
format_sql: true
format_sql: true

security:
cors:
allow-origins: "http://localhost:3000"
allowed-methods: GET, POST, PUT, DELETE, OPTIONS

jwt:
secret: "Vwgff4uvzQ4pes0Zt7sDNtL6pxGIkg2k95ZIrVhvlGmxcDRq9O1fnLN2lEzItsNE4w_lQ3f7xd09ukYxzIYS6InrYfg4ed2BSP0wmZ2RJEswzDsCLNqwRRXW780o1TYbuQpiXuUN0TnwXzb2l4YnNcXLHyBBJoIU17y1H56Aq1-ABW6MREvcFvlW-oUcMw92R0piQK4hO_Xo8AFIDnbeAqQUQ2Q91iQZRTtiNrV9Gv_pF_f1LF9OLDnvmTTy7Av7yFRstie90G9ABYsFTrxywHLzA-QMDYOeUOk8wq6TfxKbULK8PqWR__s1ebFlA3bFO1shhUdffA"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jwt 암호화키도 .env 파일에 저장하여 환경 변수로 불러오는 게 어떨까요?


data:
redis:
host: localhost
port: 6379
password: "1111"