URL 암호화

Junkyu_Kang·2024년 4월 18일
  1. 짧은 URL 생성 서비스 구현
    서버 측 구현:

짧은 URL 생성: 사용자가 localhost:8080/api/sketchbook/{sketchbookId} 같은 URL을 입력하면, 이에 대응하는 짧고 고유한 URL을 생성합니다. 이 과정에서 해시 함수나 무작위 문자열 생성 기법을 사용할 수 있습니다.
데이터베이스 저장: 생성된 짧은 URL과 원래 URL을 매핑하여 데이터베이스에 저장합니다. 이 데이터베이스는 짧은 URL을 키로, 원래 URL을 값으로 갖는 간단한 키-값 저장소로 구성할 수 있습니다.
리디렉션 로직 구현: 사용자가 짧은 URL에 접속하면, 서버는 데이터베이스에서 해당 URL을 조회하여 원래 URL로 리디렉션합니다.
클라이언트 측 구현:

사용자는 웹 인터페이스를 통해 URL을 입력하고, 서버는 이에 대응하는 짧은 URL을 생성하여 제공합니다. 사용자는 이 URL을 다른 사람과 공유할 수 있습니다.
2. 보안 고려사항
접근 제어: 생성된 URL이 누구나 접근할 수 없도록 하려면, URL에 접근 권한을 제어하는 로직을 추가할 수 있습니다. 예를 들어, URL을 생성할 때 사용자 인증을 요구하거나, 특정 사용자만 URL을 열람할 수 있도록 설정할 수 있습니다.
유효기간 설정: 짧은 URL에 유효기간을 설정하여, 특정 시간이 지나면 자동으로 만료되도록 할 수 있습니다. 이는 URL이 무한정 인터넷에 노출되는 것을 방지합니다.
3. 기술적 구현 예시
짧은 URL 생성 예시 (Python Flask 기반):

python
Copy code
from flask import Flask, redirect
import hashlib
import sqlite3

app = Flask(name)
db = sqlite3.connect('database.db', check_same_thread=False)
cursor = db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS urls (short TEXT, original TEXT)')

def generate_short_link(original_url):
short = hashlib.sha256(original_url.encode()).hexdigest()[:6]
cursor.execute('INSERT INTO urls (short, original) VALUES (?, ?)', (short, original_url))
db.commit()
return short

@app.route('/<short_url>')
def redirect_short_url(short_url):
cursor.execute('SELECT original FROM urls WHERE
User
나 스프링부트 써 JPA 사용하고, API를 통해 url로 접속하면 정보가 나오게 할 거야, 근데 비회원도 링크만 있으면 접속할 수 있게 할거야
ChatGPT
스프링 부트와 JPA를 사용하여 URL 단축기 기능을 구현하는 경우, 원래 URL을 고유한 짧은 URL로 매핑하고, 이 짧은 URL을 통해 원래 페이지로 접속할 수 있도록 설정할 수 있습니다. 비회원도 링크를 통해 접속할 수 있게 하려면 접근 제어 로직을 단순화해야 합니다.

  1. URL 단축기 데이터 모델
    먼저, URL 매핑을 저장할 엔티티를 생성합니다. 이 엔티티는 짧은 URL, 원래 URL, 생성 날짜 등의 필드를 포함할 수 있습니다.

java
Copy code
@Entity
@Table(name = "shortened_urls")
public class ShortenedUrl {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, unique = true)
private String shortUrl;

@Column(nullable = false)
private String originalUrl;

@Column(nullable = false)
private LocalDateTime createdAt = LocalDateTime.now();

// Constructors, Getters and Setters

}
2. URL 생성 및 리디렉션 로직
URL 단축기 서비스를 위한 기본 로직을 구현합니다. 이 로직은 URL을 받아 짧은 URL을 생성하고, 데이터베이스에 저장하는 기능을 포함합니다. 또한, 짧은 URL 요청 시 원래 URL로 리디렉션하는 기능도 필요합니다.

java
Copy code
@Service
public class UrlShorteningService {
@Autowired
private ShortenedUrlRepository repository;

public String createShortUrl(String originalUrl) {
    String shortUrl = generateShortUrl(originalUrl);
    ShortenedUrl url = new ShortenedUrl();
    url.setOriginalUrl(originalUrl);
    url.setShortUrl(shortUrl);
    repository.save(url);
    return shortUrl;
}

private String generateShortUrl(String originalUrl) {
    return Hashing.murmur3_32().hashString(originalUrl, StandardCharsets.UTF_8).toString().substring(0, 6);
}

public String getOriginalUrl(String shortUrl) {
    return repository.findByShortUrl(shortUrl)
                     .orElseThrow(() -> new IllegalArgumentException("Short URL not found"))
                     .getOriginalUrl();
}

}
3. 컨트롤러
API 엔드포인트를 통해 URL 생성 및 리디렉션을 처리합니다.

java
Copy code
@RestController
@RequestMapping("/api/url")
public class UrlShorteningController {
@Autowired
private UrlShorteningService urlService;

@PostMapping("/shorten")
public ResponseEntity<String> shortenUrl(@RequestBody String originalUrl) {
    String shortUrl = urlService.createShortUrl(originalUrl);
    return ResponseEntity.ok("http://yourdomain.com/" + shortUrl);
}

@GetMapping("/{shortUrl}")
public ResponseEntity<Void> redirectToOriginalUrl(@PathVariable String shortUrl) {
    String originalUrl = urlService.getOriginalUrl(shortUrl);
    return ResponseEntity.status(HttpStatus.FOUND)
                         .location(URI.create(originalUrl))
                         .build();
}

}
4. 보안 및 접근 관리
비회원도 접근 가능하도록 하기 위해 Spring Security 설정에서 특정 경로(/api/url/**)에 대한 접근을 허용합니다.

java
Copy code
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 기타 설정
.authorizeRequests()
.antMatchers("/api/url/**").permitAll()
// 다른 경로에 대한 보안 설정
.anyRequest().authenticated()
.and()
// 기타 필요한 설정
.csrf().disable();
}
이러한 설정을 통해, 스프링 부트와 JPA를 사용하여 간단하게 URL 단축기 기능을 구현할 수 있으며, 비회원도 링크만으로 접근 가능하게 할 수 있습니다.

profile
강준규

0개의 댓글